当前位置: 首页 > news >正文

金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-(一千零一拾一元整)输出。

/**
 * @(#)SimpleMoneyFormat.java
 *
 *金额转换,阿拉伯数字的金额转换为中国传统的形式输出
 * @lpxuan
 * @version 1.00 2008/7/31
 */

import java.text.NumberFormat;
import java.util.HashMap;
import java.lang.StringBuffer;

public class SimpleMoneyFormat {

    public static final String EMPTY="";
    public static final String ZERO="零";
    public static final String ONE="壹";
    public static final String TWO="贰";
    public static final String THREE="叁";
    public static final String FOUR="肆";
    public static final String FIVE="伍";
    public static final String SIX="陆";
    public static final String SEVEN="柒";
    public static final String EIGHT="捌";
    public static final String NINE="玖";
    public static final String TEN="拾";
    public static final String HUNDRED="佰";
    public static final String THOUSAND="仟";
    public static final String TEN_THOUSAND="万";
    public static final String HUNDRED_MILLION="亿";
    public static final String YUAN="元";
    public static final String JIAO="角";
    public static final String FEN="分";
    public static final String DOT=".";
   
    private static SimpleMoneyFormat formatter=null;
    private HashMap chineseNumberMap=new HashMap();
    private HashMap chineseMoenyPattern=new HashMap();
    private NumberFormat numberFormat=NumberFormat.getInstance();
   
    //私有构造函数
    private SimpleMoneyFormat() {
     numberFormat.setMaximumFractionDigits(4);
     numberFormat.setMinimumFractionDigits(2);
     numberFormat.setGroupingUsed(false);
     
     chineseNumberMap.put("0",ZERO);
     chineseNumberMap.put("1",ONE);
     chineseNumberMap.put("2",TWO);
     chineseNumberMap.put("3",THREE);
     chineseNumberMap.put("4",FOUR);
     chineseNumberMap.put("5",FIVE);
     chineseNumberMap.put("6",SIX);
     chineseNumberMap.put("7",SEVEN);
     chineseNumberMap.put("8",EIGHT);
     chineseNumberMap.put("9",NINE);
     chineseNumberMap.put(DOT,DOT);
     
     chineseMoenyPattern.put("1",TEN);
     chineseMoenyPattern.put("2",HUNDRED);
     chineseMoenyPattern.put("3",THOUSAND);
     chineseMoenyPattern.put("4",TEN_THOUSAND);
     chineseMoenyPattern.put("5",TEN);
     chineseMoenyPattern.put("6",HUNDRED);
     chineseMoenyPattern.put("7",THOUSAND);
     chineseMoenyPattern.put("8",HUNDRED_MILLION);
    }
   
    //单例模式
    public static SimpleMoneyFormat getInstance(){
     if(formatter==null)
      formatter=new SimpleMoneyFormat();
     return formatter;
    }
   
    public String format(String moneyStr){
     checkPrecision(moneyStr);
     String result;
     result=convertToChineseNumber(moneyStr);
     result=addUnitsToChineseMoenyString(result);
     return result;
    }
   
    public String format(double moneyDouble){
     return format(numberFormat.format(moneyDouble));
    }
   
    public String format(int moneyInt){
     return format(numberFormat.format(moneyInt));
    }
   
    public String format(long moneyLong){
     return format(numberFormat.format(moneyLong));
    }
   
    public String format(Number moneyNum){
     return format(numberFormat.format(moneyNum));
    }
   
    private String convertToChineseNumber(String moneyStr){
     String result;
     StringBuffer cMoneyStringBuffer =new StringBuffer();
     for(int i=0;i<moneyStr.length();i++){
      cMoneyStringBuffer.append(chineseNumberMap.
       get(moneyStr.substring(i,i+1)));
     }
     
     int indexOfDot=cMoneyStringBuffer.indexOf(DOT);
     int moneyPatternCursor=1;
     for(int i=indexOfDot-1;i>0;i--){
      cMoneyStringBuffer.insert(i,
          chineseMoenyPattern.get(EMPTY+moneyPatternCursor));
      moneyPatternCursor=moneyPatternCursor==
       8?1:moneyPatternCursor+1;
     }
     
     String fractionPart=cMoneyStringBuffer.substring(
      cMoneyStringBuffer.indexOf("."));
        cMoneyStringBuffer.delete(
         cMoneyStringBuffer.indexOf("."),
             cMoneyStringBuffer.length());
        while(cMoneyStringBuffer.indexOf("零拾")!=-1){
         cMoneyStringBuffer.replace(
          cMoneyStringBuffer.indexOf("零拾"),
              cMoneyStringBuffer.indexOf("零拾")+2,ZERO);
        }
        while(cMoneyStringBuffer.indexOf("零佰")!=-1){
         cMoneyStringBuffer.replace(
          cMoneyStringBuffer.indexOf("零佰"),
                 cMoneyStringBuffer.indexOf("零佰")+2,ZERO);
        }
        while(cMoneyStringBuffer.indexOf("零仟")!=-1){
         cMoneyStringBuffer.replace(
          cMoneyStringBuffer.indexOf("零仟"),
                 cMoneyStringBuffer.indexOf("零仟")+2,ZERO);
        }
        while(cMoneyStringBuffer.indexOf("零万")!=-1){
         cMoneyStringBuffer.replace(
          cMoneyStringBuffer.indexOf("零万"),
             cMoneyStringBuffer.indexOf("零万")+2,TEN_THOUSAND);
        }
        while(cMoneyStringBuffer.indexOf("零亿")!=-1){
         cMoneyStringBuffer.replace(
          cMoneyStringBuffer.indexOf("零亿"),
             cMoneyStringBuffer.indexOf("零亿")+2,HUNDRED_MILLION);
        }
        while(cMoneyStringBuffer.indexOf("零零")!=-1){
         cMoneyStringBuffer.replace(
          cMoneyStringBuffer.indexOf("零零"),
             cMoneyStringBuffer.indexOf("零零")+2,ZERO);
        }
        if(cMoneyStringBuffer.lastIndexOf(ZERO)
         ==cMoneyStringBuffer.length()-1){
         cMoneyStringBuffer.delete(
          cMoneyStringBuffer.length()-1,
          cMoneyStringBuffer.length());
        }
        cMoneyStringBuffer.append(fractionPart);
        result=cMoneyStringBuffer.toString();
        return result;
    }
   
    private String addUnitsToChineseMoenyString(String moneyStr){
     String result;
     StringBuffer cMoneyStringBuffer=new StringBuffer(moneyStr);
     
     int indexOfDot=cMoneyStringBuffer.indexOf(DOT);
     cMoneyStringBuffer.replace(indexOfDot,indexOfDot+1,YUAN);
     cMoneyStringBuffer.insert(cMoneyStringBuffer.length()-1,JIAO);
     cMoneyStringBuffer.insert(cMoneyStringBuffer.length(),FEN);
     
      //拾佰仟万亿等都是汉字里面才有的单位,加上它们
     if(cMoneyStringBuffer.indexOf("零角零分")!=-1)//去掉零头,加整
      cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零角零分"),
       cMoneyStringBuffer.length(),"整");
     else if(cMoneyStringBuffer.indexOf("零分")!=-1)//去掉零分,加整
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零分"),
             cMoneyStringBuffer.length(),"整");
     else if(cMoneyStringBuffer.indexOf("零角")!=-1)
      cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("零角"),
           cMoneyStringBuffer.indexOf("零角")+2);
         result=cMoneyStringBuffer.toString();
         return result;
    }
   
    //检查精度的合法性
    private void checkPrecision(String moneyStr){
     int fractionDigits=moneyStr.length()-moneyStr.indexOf(DOT)-1;
     if(fractionDigits>2)//精度不能比分低
      throw new RuntimeException("金额"+moneyStr+"的小数位数多余两位.");
    }
   
    public static void main(String[] args){
     System.out.println(getInstance().format(new Double(10010001.01)));
    }
   
}

相关文章:

  • oracle11g中SQL优化(SQL TUNING)新特性之Adaptive Cursor Sharing (ACS)
  • 浅析JAVA内部类
  • 将字符串按照单词完全反转---公司面试题
  • UI教程
  • 我想要的是什么,我真的清楚吗?
  • Java数据类型(2)------自动封装拆箱
  • Java实现排序算法(一)
  • JMS 之 Active MQ 的spring整合
  • Java实现排序算法(二)
  • vue项目实战爬坑小记001
  • Java实现排序算法(三)
  • Java通信编程之Socket入门
  • 回车提交表单
  • 数据库的查询优化技术
  • 微信jssdk分享功能,jssdk成功调用,分享内容自定义失败
  • Asm.js的简单介绍
  • css属性的继承、初识值、计算值、当前值、应用值
  • ECS应用管理最佳实践
  • iOS 系统授权开发
  • JavaScript学习总结——原型
  • JAVA多线程机制解析-volatilesynchronized
  • Kibana配置logstash,报表一体化
  • Xmanager 远程桌面 CentOS 7
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 模型微调
  • 深度学习入门:10门免费线上课程推荐
  • 事件委托的小应用
  • 为视图添加丝滑的水波纹
  • 学习Vue.js的五个小例子
  • 一些css基础学习笔记
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 在Mac OS X上安装 Ruby运行环境
  • 如何在招聘中考核.NET架构师
  • ​2020 年大前端技术趋势解读
  • ​批处理文件中的errorlevel用法
  • (9)目标检测_SSD的原理
  • (pytorch进阶之路)扩散概率模型
  • (初研) Sentence-embedding fine-tune notebook
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET gRPC 和RESTful简单对比
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .Net下的签名与混淆
  • @angular/cli项目构建--http(2)
  • [04]Web前端进阶—JS伪数组
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [BJDCTF 2020]easy_md5
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [C]整形提升(转载)
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件
  • [hdu 1711] Number Sequence [kmp]