public class RMB {//返回转换好的大写形式public static String numberToRMB(String money) {return cleanZero(splitNum(roundString(money)));}// 将小写金额转换成大写金额private static String splitNum(String s) {// 如果传入的是空串则继续返回空串if ("".equals(s) || s == null) {return "";}// 以小数点为界分割这个字符串int index = s.indexOf(".");// 截取并转换这个数的整数部分String intOnly = s.substring(0, index);String part1 = numFormat(1, intOnly);// 截取并转换这个数的小数部分String smallOnly = s.substring(index + 1);String part2 = numFormat(2, smallOnly);// 把转换好了的整数部分和小数部分重新拼凑一个新的字符串return part1 + part2;}/*** 把传入的数转换为中文金额大写形式* @param flag*            int 标志位,1 表示转换整数部分,0 表示转换小数部分* @param s*            String 要转换的字符串* @return 转换好的带单位的中文金额大写形式*/private static String numFormat(int flag, String s) {int sLength = s.length();// 货币大写形式String bigLetter[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };// 货币单位String unit[] = { "元", "拾", "佰", "仟", "万",// 拾万位到仟万位"拾", "佰", "仟",// 亿位到万亿位"亿", "拾", "佰", "仟", "万" };String small[] = { "分", "角" };// 用来存放转换后的新字符串String newS = "";// 逐位替换为中文大写形式for (int i = 0; i < sLength; i++) {if (flag == 1) {// 转换整数部分为中文大写形式(带单位)newS = newS + bigLetter[s.charAt(i) - 48]+ unit[sLength - i - 1];} else if (flag == 2) {// 转换小数部分(带单位)newS = newS + bigLetter[s.charAt(i) - 48]+ small[sLength - i - 1];}}return newS;}/*** 对传入的数进行四舍五入操作* * @param sString*            从命令行输入的那个数* @return 四舍五入后的新值*/private static String roundString(String s) {// 如果传入的是空串则继续返回空串if ("".equals(s)) {return "";}// 将这个数转换成 double 类型,并对其进行四舍五入操作double d = Double.parseDouble(s);// 此操作作用在小数点后两位上d = (d * 100 + 0.5) / 100;// 将 d 进行格式化s = new java.text.DecimalFormat("##0.000").format(d);// 以小数点为界分割这个字符串int index = s.indexOf(".");// 这个数的整数部分String intOnly = s.substring(0, index);// 规定数值的最大长度只能到万亿单位,否则返回 "0"if (intOnly.length() > 13) {return "";}// 这个数的小数部分String smallOnly = s.substring(index + 1);// 如果小数部分大于两位,只截取小数点后两位if (smallOnly.length() > 2) {String roundSmall = smallOnly.substring(0, 2);// 把整数部分和新截取的小数部分重新拼凑这个字符串s = intOnly + "." + roundSmall;}return s;}/*** 把已经转换好的中文金额大写形式加以改进,清理这个字 符串里面多余的零,让这个字符串变得更加可观 注:传入的这个数应该是经过 splitNum()* 方法进行处理,这个字 符串应该已经是用中文金额大写形式表示的* * @param s*            String 已经转换好的字符串* @return 改进后的字符串*/private static String cleanZero(String s) {// 如果传入的是空串则继续返回空串if ("".equals(s)) {return "";}// 如果用户开始输入了很多 0 去掉字符串前面多余的'零',使其看上去更符合习惯while (s.charAt(0) == '零') {// 将字符串中的 "零" 和它对应的单位去掉s = s.substring(2);// 如果用户当初输入的时候只输入了 0,则只返回一个 "零"if (s.length() == 0) {return "零";}}// 字符串中存在多个'零'在一起的时候只读出一个'零',并省略多余的单位/* 由于本人对算法的研究太菜了,只能用4个正则表达式去转换了,各位大虾别介意哈... */String regex1[] = { "零仟", "零佰", "零拾" };String regex2[] = { "零亿", "零万", "零元" };String regex3[] = { "亿", "万", "元" };String regex4[] = { "零角", "零分" };// 第一轮转换把 "零仟", 零佰","零拾"等字符串替换成一个"零"for (int i = 0; i < 3; i++) {s = s.replaceAll(regex1[i], "零");}// 第二轮转换考虑 "零亿","零万","零元"等情况// "亿","万","元"这些单位有些情况是不能省的,需要保留下来for (int i = 0; i < 3; i++) {// 当第一轮转换过后有可能有很多个零叠在一起// 要把很多个重复的零变成一个零s = s.replaceAll("零零零", "零");s = s.replaceAll("零零", "零");s = s.replaceAll(regex2[i], regex3[i]);}// 第三轮转换把"零角","零分"字符串省略for (int i = 0; i < 2; i++) {s = s.replaceAll(regex4[i], "");}// 当"万"到"亿"之间全部是"零"的时候,忽略"亿万"单位,只保留一个"亿"s = s.replaceAll("亿万", "亿");return s;}
}

转载于:https://www.cnblogs.com/yshyee/p/4109730.html

(转)金额转中文大写相关推荐

  1. C# 金额转中文大写

    今天看到一个库是把金额转中文大写,看起来很容易,所以我就自己写了 创建的项目是创建一个 dot net core 的项目,实际上这个项目可以创建为 Stand 的. 首先创建类,这个类的构造传入一个 ...

  2. 将金额转换为中文大写

    将金额转换为中文大写 思路 判断符号,0则直接返回 数字去掉点 00结尾的要加'整' 循环,从后面每次取一个数位上的值直到最前面, 若是非零则加上对应的数值和单位 若是零,判断上一个是否为零,是,则不 ...

  3. SDNUOJ 1213.金额的中文大写

    今天做了一个题,感觉网上的程序有些繁琐或者不够简明,所以打算把自己的发上来,供大家借鉴. 前几天学校的OJ坏了,刚刚修好我便看到了这个题. 1213.金额的中文大写 Time Limit: 1000 ...

  4. 正则也很牛,把阿拉伯数字的金额转换为中文大写数字

    using System; using System.Text.RegularExpressions; class Program {   // 把阿拉伯数字的金额转换为中文大写数字   static ...

  5. 金额转中文大写源代码(原创)

    1,问题描述:将数字金额转成中文大写 2,源代码如下 public class ZHapi {private static String[] tmp = {"零", "壹 ...

  6. 小写金额变中文大写和英文方法总结

    #region 变量申明         private static readonly String cnNumber = "零壹贰叁肆伍陆柒捌玖";         priva ...

  7. 小写金额转为中文大写

    目标 将小写的金额转化为中文大写,如99.99转为"玖拾玖圆玖角玖分" 思路 阿拉伯数字有对应的中文大写,需要将其转为中文大写. 金额分为小数部分和整数部分分别处理,整数部分和小数 ...

  8. java 中文大写金额_java编写的金额转中文大写

    1 package com.coxon.finance.tool;2 3 public classChinaNumber4 {5 6 private static String[] CH = { &q ...

  9. 工具类篇-03-BigDecimal金额转中文大写

    package com.greatmicro.ates.settle.core.util; import java.math.BigDecimal;/*** 金额工具类* @author Wang*/ ...

最新文章

  1. 在闲鱼传疯了,某大厂P8面试题库泄漏!
  2. Docker部署文档
  3. scapy安装and简介
  4. 线性一致性理解Linearizability
  5. 阿里云服务器购买该如何选择?阿里云服务器购买步骤流程介绍...
  6. 【期望】选书问题(金牌导航 期望-7)
  7. servlet 源码分析
  8. 桥接模式 - 设计模式学习
  9. java regex详解
  10. 解决tomcat内存溢出问题
  11. 爱加密脱壳(持续更新)
  12. 没啥用的纯前端打造一个实时 markdown 编辑器
  13. MAC jd-gui 安装
  14. 计算机研究生期末汇报,研究生学期总结ppt.doc
  15. Deep Dream:理解深度神经网络结构及应用(实战篇)
  16. 行云当如流水,浪潮云新一代行业云MEP战略带来了什么?
  17. 数学建模-对策论模型
  18. wordpress文章自动同步天涯博客插件wp2Tianya发布
  19. CF1633D Make Them Equal 题解
  20. 最大公约数和最小公倍数实现

热门文章

  1. 使用rancher对Docker容器服务升级
  2. 如何判断飞机的年限_技术流带你鉴定前风挡玻璃更换,不再使用日期判断!
  3. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)
  4. 2021-2027年中国氟磷腈橡胶行业发展形势分析及市场前景规划报告
  5. Mysql创建数据库用户
  6. 【JavaScript总结】JavaScript语法基础:JS高级语法
  7. Pytorch使用tensorboardX可视化。超详细
  8. 机器都会学习了,你的神经网络还跑不动?来看看这些建议
  9. 【Learning Notes】线性链条件随机场(CRF)原理及实现
  10. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam