java开发_数字转换汉语中人民币的大写_完整版

做这个应用,源于突然的一个想法:看到发票上面的数字要转换成汉语中人民币的大写

于是就有了下面的这些事儿.....

先看看运行效果:

======================================================

代码部分

======================================================

  1 package com.b510.number2char;
  2 
  3 import java.math.BigDecimal;
  4 
  5 /**
  6  * 数字转换为汉语中人民币的大写<br>
  7  * 
  8  * @author hongten
  9  * @contact hongtenzone@foxmail.com
 10  * @create 2013-08-13
 11  */
 12 public class NumberToCN {
 13     /**
 14      * 汉语中数字大写
 15      */
 16     private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆",
 17             "伍", "陆", "柒", "捌", "玖" };
 18     /**
 19      * 汉语中货币单位大写,这样的设计类似于占位符
 20      */
 21     private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元",
 22             "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾",
 23             "佰", "仟" };
 24     /**
 25      * 特殊字符:整
 26      */
 27     private static final String CN_FULL = "整";
 28     /**
 29      * 特殊字符:负
 30      */
 31     private static final String CN_NEGATIVE = "负";
 32     /**
 33      * 金额的精度,默认值为2
 34      */
 35     private static final int MONEY_PRECISION = 2;
 36     /**
 37      * 特殊字符:零元整
 38      */
 39     private static final String CN_ZEOR_FULL = "零元" + CN_FULL;
 40 
 41     /**
 42      * 把输入的金额转换为汉语中人民币的大写
 43      * 
 44      * @param numberOfMoney
 45      *            输入的金额
 46      * @return 对应的汉语大写
 47      */
 48     public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {
 49         StringBuffer sb = new StringBuffer();
 50         // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or
 51         // positive.
 52         int signum = numberOfMoney.signum();
 53         // 零元整的情况
 54         if (signum == 0) {
 55             return CN_ZEOR_FULL;
 56         }
 57         //这里会进行金额的四舍五入
 58         long number = numberOfMoney.movePointRight(MONEY_PRECISION)
 59                 .setScale(0, 4).abs().longValue();
 60         // 得到小数点后两位值
 61         long scale = number % 100;
 62         int numUnit = 0;
 63         int numIndex = 0;
 64         boolean getZero = false;
 65         // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11
 66         if (!(scale > 0)) {
 67             numIndex = 2;
 68             number = number / 100;
 69             getZero = true;
 70         }
 71         if ((scale > 0) && (!(scale % 10 > 0))) {
 72             numIndex = 1;
 73             number = number / 10;
 74             getZero = true;
 75         }
 76         int zeroSize = 0;
 77         while (true) {
 78             if (number <= 0) {
 79                 break;
 80             }
 81             // 每次获取到最后一个数
 82             numUnit = (int) (number % 10);
 83             if (numUnit > 0) {
 84                 if ((numIndex == 9) && (zeroSize >= 3)) {
 85                     sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);
 86                 }
 87                 if ((numIndex == 13) && (zeroSize >= 3)) {
 88                     sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);
 89                 }
 90                 sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
 91                 sb.insert(0, CN_UPPER_NUMBER[numUnit]);
 92                 getZero = false;
 93                 zeroSize = 0;
 94             } else {
 95                 ++zeroSize;
 96                 if (!(getZero)) {
 97                     sb.insert(0, CN_UPPER_NUMBER[numUnit]);
 98                 }
 99                 if (numIndex == 2) {
100                     if (number > 0) {
101                         sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
102                     }
103                 } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {
104                     sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
105                 }
106                 getZero = true;
107             }
108             // 让number每次都去掉最后一个数
109             number = number / 10;
110             ++numIndex;
111         }
112         // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
113         if (signum == -1) {
114             sb.insert(0, CN_NEGATIVE);
115         }
116         // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
117         if (!(scale > 0)) {
118             sb.append(CN_FULL);
119         }
120         return sb.toString();
121     }
122 
123     public static void main(String[] args) {
124         double money = 2020004.01;
125         BigDecimal numberOfMoney = new BigDecimal(money);
126         String s = NumberToCN.number2CNMontrayUnit(numberOfMoney);
127         System.out.println("你输入的金额为:【"+ money +"】   #--# [" +s.toString()+"]");
128     }
129 }

更多资料:

http://cha.buyiju.com/rmb.asp

http://hi.baidu.com/superfeng/item/1bd59013fa97326e70d5e875

http://tools.2345.com/shuzi/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端之路

来自Google的瓜娃简介之Lists

注:以下分析均基于Guava18 背景 在很久很久以前(大概就是jdk7之前吧)没有钻石语法的我们苦逼的一遍又一遍的写着泛型 List<String> lis...

2805
来自专栏Android知识点总结

Java总结IO之总集篇

字符流和字节流向来各行其事,很少有交集。 但Reader和Writer有两个奇子,名叫InputStreamReader(男)和OutputStreamWri...

1335
来自专栏十月梦想

JavaScript一维数组遍历

通过for循环获取数组的下标循环输出数组,和php的遍历类似,这里for循环遍历一维数组

852
来自专栏程序你好

如何使用Java Stream Collectors(归约器)?

Java 8引入了Stream API,它允许我们以声明的方式处理数据。此外,Stream还可以在不需要编写多线程代码的情况下使用多核架构。

791
来自专栏swag code

练习-Map集合的操作

Teacher对象的值: “Tom”,”Java”, “John”,”Oracle”, “Susan”,”Oracle”, “Jerry”,”JDBC”...

1073
来自专栏数据小魔方

左手用R右手Python系列之——json序列化与反序列化

json格式数据作为如今越来越流行的数据交换格式,几乎已经成为web端数据交互的标准,主流的数据科学语言R,Python都中都有非常完善的半结构化数据与json...

3077
来自专栏HansBug's Lab

3211: 花神游历各国

3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 1042  Solved: 381 ...

2775
来自专栏WindCoder

继承练习之医学院教师类—C++

602
来自专栏数据结构与算法

P1967 货车运输

题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物, 司机们想...

3309
来自专栏HansBug's Lab

2764: [JLOI2011]基因补全

2764: [JLOI2011]基因补全 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 570  Solv...

3028

扫码关注云+社区

领取腾讯云代金券