一、背景

今天在网络上找金额数字转人民币大写,找了几个版本,下载使用后都不怎么理想,或多或少存在点问题,另外一个原因就是出现了更大的金额兆(万亿),最后在忍无可忍的情况下决定自己动手写金额转换的程序。


二、基本思路四位分割方法

因为中文的数字表达体系是“个、十、百、千、万、十万、百万、千万、亿、十亿、百亿、千亿、兆、十兆、百兆、千兆、京、十京、百京、千京、垓、十垓、百垓……”,每四位数升一个级。例如:

123456789 --->   1+  单位:亿+ (一个轮回:2仟3佰4拾5) +单位万 +(一个轮回:6仟7佰8拾9)元

采用这种方法,我们就可以JAVA的DecimalFormat 表达式,将上述的金额进行格式化,然后就可以4位一个单元进行金额转换,转换好后再加上相应的单位(万,亿,兆,京),就大功告成了。测试后的结果和WPS的EXCEL进行了对比,测试案例中均保持了一致,有问题欢迎指正。

三、JAVA版本代码

import java.math.BigDecimal;
import java.text.DecimalFormat;public class ToChinseMoney {private static String[] unit = {"", "万", "亿", "兆", "京"};private static String[] beforeScale = {"仟", "佰", "拾", ""};private static String[] numArray = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};private static String[] afterScale = {"角", "分"};public static String toUpperCaseZhCn(BigDecimal value) {StringBuffer buf = new StringBuffer();if (value.compareTo(new BigDecimal("0")) < 0)buf.append("负");value = value.abs();String c[] = value.toString().split("\\.");//分割出来,.前面对应角分splitByFour(c[0], buf);if (c.length > 1 && (c[1].toCharArray()[0] - 48 != 0 || c[1].toCharArray()[1] - 48 != 0)) {char[] decimal = c[1].toCharArray();if (decimal[0] - 48 == 0)buf.append(numArray[decimal[0] - 48]);elsebuf.append(numArray[decimal[0] - 48]).append(afterScale[0]);if (decimal.length > 1 && decimal[1] - 48 != 0)buf.append(numArray[decimal[1] - 48]).append(afterScale[1]);} return buf.toString();}public static void splitByFour(String strIntpart, StringBuffer buf) {if(new BigDecimal("0").equals(  new BigDecimal(strIntpart))){buf.append("零");return;}DecimalFormat df4 = new DecimalFormat("####,####,####,####,####");String formatMount = df4.format(new BigDecimal(strIntpart));String[] splitList = formatMount.split(",");if (splitList.length > 5) {System.out.println("金额超限!");
//                throw new Exception("金额超限!");}for (int n = 0; n < splitList.length; n++) {String onePart = splitList[n];if (Integer.parseInt(onePart) != 0){RecursionChangeTo(onePart, buf, false);buf.append(unit[splitList.length - 1 - n]);}}}public static void RecursionChangeTo(String strIntpart, StringBuffer buf, boolean preIsZero) {BigDecimal Intpart = new BigDecimal(strIntpart);boolean iszero = false;String topone = "";if (strIntpart.length() > 1)topone = strIntpart.substring(0, 1);elsetopone = strIntpart;int inttopone = Integer.parseInt(topone);if (inttopone != 0) {if (preIsZero)//前面是0 ,这里不是0buf.append("零");//金额部分buf.append(numArray[inttopone]);//单位部分buf.append(beforeScale[beforeScale.length - strIntpart.length()]);} elseiszero = true;if (strIntpart.length() > 1) {String nextString = strIntpart.substring(1, strIntpart.length());if (inttopone != 0)RecursionChangeTo(nextString, buf, false);elseRecursionChangeTo(nextString, buf, true);}}}

三、结果验证

这里采用了WPS的EXCEL对数字转人民币大写做了验证,在验证过程中也发现了WPS转换的最高限制,见图片黄色部分:

JAVA版数字转人民币大写-四位数分隔法相关推荐

  1. .net 将数字转换为人民币大写

    程序中用到将数字转换为大写人民币,在网上找了一个方法,记录下来. using System.Text; using System.Text.RegularExpressions; ///<sum ...

  2. js 数字转人民币大写

    目前网上有许多的数字转人民币大写功能,但是在某些数字上就回出现错误, 比如501356,这个转换之后,有的会转换成 "伍拾万零壹仟叁佰伍拾陆" ,单位万和千紧密相连,中间是不需要 ...

  3. C#数字转人民币大写

    C#方法 废话不多说,直接上代码: /// <summary> /// 数字转换为大写人民币表示 /// </summary> /// <param name=" ...

  4. ORACLE数字转换人民币大写

    ORACLE 数字转换人民币大写 示例. 数字                    :183066999230.68 人民币大写        :壹仟捌佰参拾亿陆仟陆佰玖拾玖万玖仟贰佰参拾圆陆角捌分 ...

  5. php人民币函数,PHP数字转人民币大写函数

    PHP数字转人民币大写函数2018-04-23 09:59 如果你是一位财务人员,肯定遇到过一个问题,就是遇到一串数字,要将其写成大写的人民币,有时很容易搞错. 那么有没有什么方法可以准确的解决呢? ...

  6. java实现阿拉伯数字转人民币大写(精确到分)

    这是一个将阿拉伯数字转人民币大写的工具类, 精确到人民币大写分 package com.client;import java.math.BigDecimal;/*** Class Descriptio ...

  7. 把数字转换为人民币大写(用于银行系统)

    大二是老师让做一个综合试验::用C++实现简易银行系统,其中用到在打印流水账时要求把金额转换为人民币大写...当时傻里吧唧的,,,随便拷贝了个同学的应付老师交了了事...前一段一个大二的弟兄向我提起银 ...

  8. 浮点数字转换为人民币大写字体

    新开博客,贴上一段平常时写的代码,权当记录和分享. 下面是代码块(有比较详细的注释,转换过程中需要注意的是0的处理): //浮点数转换为人民币大写字体 import java.util.Scanner ...

  9. string去掉后四位_数字黑洞(下):四位数的黑洞

    在上一期中我们展示了三位黑洞数的求解过程,其中的关键技术是数字的排序及位置交换.本期文章继续讨论有关数字黑洞的问题,展示四位黑洞数的求解过程. 一.用户界面 在App Inventor开发环境中打开上 ...

  10. Java将数字金额转为大写

    首先将数字金额定义为字符串类型,然后再转为int或double型:判断是否是负数或有小数点,再进行下一步处理. 代码如下: package com.study;import com.sun.deplo ...

最新文章

  1. shell 实例收集
  2. php php5,初探 PHP5 (一)_PHP
  3. 怎么看cudnn的版本好_祖坟风水怎么看,好祖坟有什么征兆?
  4. 关于类成员函数中访问同类对象的私有成员
  5. android自定义队列,Android 消息机制(一)消息队列的创建与循环的开始 Looper与MessageQueue...
  6. 使用了 PHP Code Sniffer 未使用的参数 Unused parameter
  7. thinkphp框架环境部署
  8. 利用哈希map快速判断两个数组的交集
  9. request.getRequestDispatcher(url).forward(request, response)
  10. 设计模式-第五篇之命令模式
  11. python 声音模仿_浅谈盘点5种基于Python生成的个性化语音方法
  12. 计算机体系结构和计算机组成原理
  13. Qt第一章:pyside6安装与配置
  14. 点可云ERP-V7.0-国产免费开源的ERP进销存系统 附带安装详细教程
  15. 游戏软件性能测试报告,游戏性能测试及总结
  16. MLE, MAP and LSM
  17. C#MessageBox(消息提示框)使用详解
  18. 802.11 MAC 基础
  19. ecg 幅度_心电图 (ECG) 与光电容积图 (PPG) 基本工作原理,如何测量?
  20. 《嵌入式系统 – 玩转ART-Pi开发板(基于RT-Thread系统)》第9章 基于Select/Poll实现并发服务器(二)

热门文章

  1. ISO光盘镜像导入到U盘的方法
  2. 智能卡卡发卡流程(收藏1)
  3. 少儿学编程系列 --- 使用python程序暴力求解:数学游戏 24 Game的答案
  4. 东北大学 计算机网络,东北大学计算机网络B卷(附答案).pdf
  5. Moto me525+ 刷机
  6. YB1205B 外置MOS异步升压恒流LED驱动控制器
  7. openid是什么意思?token是什么意思?
  8. 考研二战,入职华为,反向调剂电子科大深圳
  9. 小学生c语言入门教程,小学生都看得懂的C语言入门(5): 指针
  10. discuz怎么自定义php,Discuz添加自定义数据调用模块