《疯狂Java讲义》里面的一道练习题:将浮点数转成人民币读法字符串,例如将1006.33转为壹仟零陆元叁角叁分。

根据人民币大写金额规范,转换有几点要注意的:

  1. 阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖元伍角。
  2. 阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6,007.14,应写成人民币陆仟零柒元壹角肆分。
  3. 阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但仟位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1,680.32,应写成人民币壹仟陆佰捌拾元零三角贰分,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟元伍角叁分。
  4. 阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾元零肆分。
  5. 大写金额到“元”为止的,在“元”之后应写上“整”或“正”字,在“角”之后可以不写“整”或“正”字,在“分”之后的不写”整“或”正“字。

我的思路是:

  1. 将输入格式化成:“xxxx,xxxx,xx”,以千位划分整数部分,小数部分保留两位(到分位);
  2. 将输入拆分为整数部分和小数部分;
  3. 倒序逐位转换,先处理小数部分,再处理整数部分;
  4. 转换后,根据人民币大写金额规范处理多余的“零”字。

详见代码:

  1. package avstudio.utils;
  2. import java.text.DecimalFormat;
  3. /**
  4. * Program Name: ConvertRMB <br />
  5. * Description: 将浮点金额转换成人民币读法,精确到分,例如输入:1006.33,输出:壹仟零陆元叁角叁分 <br /> 最大支持值到9999999999999998 <br />
  6. * Date: 2011-10-19 <br />
  7. * Email: chialvin.chan@gmail.com <br />
  8. * Copyright (C), 2011-2012, ChiAlvin.Chan <br />
  9. * @author ChiAlvin.Chan
  10. * @version 1.0
  11. */
  12. publicclass ConvertRMB {
  13. /**
  14. * @param d 需要转换的金额
  15. * @return 返回大写金额字符串(String)
  16. */
  17. publicstatic String convert(double d) {
  18. String[] numTables = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
  19. String[] unitTables = new String[]{"分", "角"};
  20. String[] levelTables = new String[]{"万", "亿"};
  21. String[] mulTables = new String[]{"", "拾", "佰", "仟"};
  22. StringBuffer result = new StringBuffer();
  23. int index = -1;
  24. // 将数字格式化为xxxx.xx
  25. DecimalFormat df = new DecimalFormat();
  26. df.setGroupingSize(4);
  27. df.setMinimumFractionDigits(2);
  28. String strFormat = df.format(d);
  29. // 拆分整数部分和小数部分
  30. StringBuffer intPart = new StringBuffer(strFormat.substring(0, strFormat.length()-3));
  31. StringBuffer decimalPart = new StringBuffer(strFormat.substring(intPart.length()+1, strFormat.length()));
  32. // 处理小数部分
  33. decimalPart.reverse();
  34. for(int i=0; i<decimalPart.length(); i++) {
  35. result.append(unitTables[i%2]);
  36. result.append(numTables[Character.getNumericValue(decimalPart.charAt(i))]);
  37. }
  38. // 处理整数部分
  39. result.append("元");
  40. intPart.reverse();
  41. int level = 0;
  42. for(int i=0; i<intPart.length(); i++) {
  43. if(intPart.charAt(i) != ',') {
  44. result.append(mulTables[i%5]);
  45. result.append(numTables[Character.getNumericValue(intPart.charAt(i))]);
  46. } else {
  47. result.append(levelTables[level]);
  48. level = ++level % 2;
  49. }
  50. }
  51. result.reverse();
  52. // 处理多余的零
  53. while((index = result.indexOf("零分")) != -1){ result.deleteCharAt(index+1); };
  54. while((index = result.indexOf("零角")) != -1){ result.deleteCharAt(index+1); };
  55. while((index = result.indexOf("零拾")) != -1){ result.deleteCharAt(index+1); };
  56. while((index = result.indexOf("零佰")) != -1){ result.deleteCharAt(index+1); };
  57. while((index = result.indexOf("零仟")) != -1){ result.deleteCharAt(index+1); };
  58. // 没有小数部分
  59. while((index = result.indexOf("元零零")) != -1) {
  60. result.delete(index+1, index+3);
  61. result.append("整");
  62. };
  63. while((index = result.indexOf("零零")) != -1){ result.deleteCharAt(index); };
  64. while((index = result.indexOf("零元")) != -1) {result.deleteCharAt(index);};
  65. while((index = result.indexOf("零万")) != -1) {result.deleteCharAt(index);};
  66. while((index = result.indexOf("零亿")) != -1) {result.deleteCharAt(index);};
  67. while((index = result.indexOf("亿万")) != -1) {result.deleteCharAt(index+1);};
  68. // 没有分位
  69. while((index = result.indexOf("角零")) != -1){ result.deleteCharAt(index+1); };
  70. // 只有分位
  71. while((index = result.indexOf("元零")) != -1 && index == 0){ result.delete(index, index+2); };
  72. // 只有小数位
  73. while((index = result.indexOf("元")) != -1 && index == 0){ result.deleteCharAt(index); };
  74. // 零元
  75. while((index = result.indexOf("整")) != -1 && index == 0){ result.replace(index, index+2, "零元"); };
  76. return result.toString();
  77. }
  78. publicstaticvoid main(String[] args) {
  79. // TODO Auto-generated method stub
  80. System.out.println(ConvertRMB.convert(1680.32));
  81. System.out.println(ConvertRMB.convert(1409.50));
  82. System.out.println(ConvertRMB.convert(6007.14));
  83. System.out.println(ConvertRMB.convert(107000.53));
  84. System.out.println(ConvertRMB.convert(16409.02));
  85. System.out.println(ConvertRMB.convert(325.04));
  86. System.out.println(ConvertRMB.convert(0.01));
  87. System.out.println(ConvertRMB.convert(2.10));
  88. System.out.println(ConvertRMB.convert(0.49));
  89. System.out.println(ConvertRMB.convert(1.49));
  90. System.out.println(ConvertRMB.convert(1d));
  91. System.out.println(ConvertRMB.convert(0d));
  92. System.out.println(ConvertRMB.convert(1234567891012d));
  93. System.out.println(ConvertRMB.convert(9000000000000d));
  94. System.out.println(ConvertRMB.convert(9010000000005d));
  95. System.out.println(ConvertRMB.convert(9999999999999998d));
  96. }
  97. }

输出:

  1. 壹仟陆佰捌拾元叁角贰分
  2. 壹仟肆佰零玖元伍角
  3. 陆仟零柒元壹角肆分
  4. 壹拾万柒仟元伍角叁分
  5. 壹万陆仟肆佰零玖元零贰分
  6. 叁佰贰拾伍元零肆分
  7. 壹分
  8. 贰元壹角
  9. 肆角玖分
  10. 壹元肆角玖分
  11. 壹元整
  12. 零元
  13. 壹万贰仟叁佰肆拾伍亿陆仟柒佰捌拾玖万壹仟零壹拾贰元整
  14. 玖万亿元整
  15. 玖万零壹佰亿零伍元整
  16. 玖仟玖佰玖拾玖万玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾捌元整

人民币大写金额转换算法相关推荐

  1. JAVAScript实现人民币大小写转换算法

    大家好,我是梦辛工作室的灵,最近在写一个人民币大小写转换的工具,就把数字转换为大写中文 界面如下: 这样就很清楚了,做财务软件的时候应该会经常用到: 转换代码如下(是从右向左读): function ...

  2. python 的人民币大小写转换算法

    以上是测试好的源码 只做了基本测试感觉问题不大 虽然位数只到了亿位 不过后面也差不多 应该还是在 pr 列表里进行合理的添加 然后整体逻辑就是每四位放一起进行处理 希望对你有帮助!也欢迎私信交流. 后 ...

  3. 真正正确的人民币 小写 大写 转换算法

    网上很多人民币数字转换成人民币大写的算法,但是,按照财务的规则,没有一个是对的. 于是我按照财务的规则重新写了一次这个逻辑 首先来看财务的大写人民币规则 (一) 阿拉伯数字中间有"0&quo ...

  4. C#转换人民币大写金额

    /// <summary>/// 转换人民币大写金额./// </summary>public class RMBConverter{/// <summary>// ...

  5. python数字大小写转换代码_用python实现把数字人民币金额转换成大写的脚本程序...

    # -*- coding: utf-8 -*- def Num2MoneyFormat( change_number ): """ .转换数字为大写货币格式( forma ...

  6. 超强技巧分享,如何将人民币大小写转换?

    当我们在制作财务表格的时候,需要将金额的大写跟小写进行转换,如果要一个一个手打出来的话,那就太浪费时间了,一两个数额还好,如果一整个表格的数额,那就不得了了,那要花费多少时间才能将小写金额转换成大写金 ...

  7. C#数字金额转人民币大写金额的实现

    要过年了,朋友圈里充斥着各种年的味道,还有一种特别的朋友圈今年格外显眼,好像一股气流冲击着我的小心脏,2022真的是太难了. 这里,专门为各位老板写了一套数字金额转人民币大写金额的实现方法,希望大家都 ...

  8. java中人民币的符号怎么打_Java学习笔记---字符串操作(人民币大写转换的实现)...

    向开始学习语言的的同学们推荐下,如果你想学习语言的某个特性,比方说数据库编程,或者网络编程,最好找一个实用的例子,然后不懂的去翻书,去查资料,这样目的性就很强了,个人感觉比对着语法书敲上面的例子效率要 ...

  9. 人民币大小写转换(阿拉伯数字和汉字转换)

    最近在网上看到一个关于数字转换人民币大写的算法的一篇博客,很好,就收藏了,算法直接copy原作者的.自己做了一点小改动: 1.以CString代替,封装成类. 2.修复超过"亿"时 ...

  10. gps84转换gcj02公式_地球坐标系 (WGS-84) 相互转火星坐标系 (GCJ-02) 的转换算法

    import java.util.HashMap; import java.util.Map; /** * 地球坐标系 (WGS-84) 相互转火星坐标系 (GCJ-02) 的转换算法 * * @au ...

最新文章

  1. LabVIEW目标测量方法(基础篇—12)
  2. 22.调用delay()方法延时执行动画效果
  3. WCF4.0新特性体验(6):路由服务Routing Service(下)
  4. mxnet is not presented
  5. 使用jquery文件上传控件Uploadify来异步上传图片
  6. 谈家政O2O平台的出路
  7. 《Unity 3D 游戏开发技术详解与典型案例》——1.3节第一个Unity 3D程序
  8. 走近分形与混沌(part7)--三体与混沌
  9. 函数调用基础概念原理
  10. Android之如何让Android studio编译更快
  11. 关于python_关于Python,你必须知道的事!
  12. Flash Builder 找不到Adobe Flash Player或者Flash Builder 找不到debug版本的解决方法
  13. [转]sql server 2005 中的内连接和外连接
  14. OpenJDK8已经将近3个月没修改了
  15. python列表所有元素平均值_python—组合数据类型
  16. 【镜像取证篇】VMware虚拟机配置文件取证
  17. Help Hanzo LightOJ - 1197(素数筛法)
  18. caffe与Python接口的配置(VC2013 Windows CUDA7.5 Python2.7.12)
  19. python爬取音乐并保存的格式_python爬取QQ音乐歌单歌曲保存到本地,json解析
  20. 做一个功能比较齐全的小程序商城选择好的系统很重要

热门文章

  1. 叮铃铃~: 一个Vue铃声/提示音组件
  2. Adam:大规模分布式机器学习框架
  3. ZEMAX 2018中文版光学仿真视频教程
  4. 机器学习实例—手写体识别
  5. 小程序之父子组件传值详解
  6. html状态码206,http状态码204/206/200理解
  7. H3CIE网络工程师成长之路
  8. Java中NIO详解
  9. http 连接池 java_HttpClient 连接池管理
  10. 机器学习:弱监督学习简介