需求场景:传入一个数字,把它转成人民币大写。

先看下人民币大写规则:

一、人民币大写金额数字到“元”为止的.在“元”之后.应写“整”(或“正”)字.在“角”之后.可以不写“整”(或“正”)字.大写金额数字有“分”的.“分”后面不写“整”(或“正”)字。
二、人民币大写金额数字前应标明“人民币”字样.大写金额数字有“分”的.“分”后面不写“整”(或“正”)字.
三、人民币大写金额数字前应标明“人民币”字样.大写金额数字应紧接“人民币”字样填写.不得留有空白.大写金额数字前未印“人民币”字样的.应加填“人民币”三字.在票据和结算凭证大写金额栏内不得预印固定的“仟.佰.拾.万.仟.佰.拾.元.角.分”字样。
四、阿拉伯数字小写金额数字中有“0”时.人民币大写应按照汉语语言规律.金额数字构成和防止涂改的要求进行书写.举例如下:
1. 阿拉伯金额数字中间有“0”时.人民币大写要写“零”字.如¥1409.50.应写成人民币陆壹仟肆佰零玖元伍角。
2. 阿拉伯金额数字中间连续有几个“0”时.人民币大写金额中间可以只写一个“零”字.如¥6007.14.应写成人民币陆仟零柒元壹角肆分.
3. 阿拉伯金额数字万位和元位是“0”.或者数字中间连续有几个“0”.万位.元位也是“0”.但千位.角位不是“0”时.中文大写金额中可以只写一个零字.也可以不写“零”字.如¥1680.32.应写成人民币壹仟陆佰捌拾元零叁角贰分.或者写成人民币壹仟陆佰捌拾元叁角贰分.又如¥107000.53.应写成人民币壹拾万柒仟元零伍角叁分.或者写成人民币壹拾万零柒仟元伍角叁分。
4. 阿拉伯金额数字角位是“0”.而分位不是“0”时.中文大写金额“元”后面应写“零”字.如¥16409.02.应写成人民币壹万陆仟肆佰零玖元零贰分,又如¥325.04.应写成人民币叁佰贰拾伍元零肆分。

再介绍下面我写的工具类,我写的这个类就一个方法toUpper(String s),入参的整数部分不能超过16位数,返回参数是转换后的大写。总体而言就是一个String根据一定的规则转成另一个String。逻辑就不说了,直接看代码:

package com.syz.rmb;import java.util.Arrays;public class RmbUtil {private static String reg = "[0-9]*\\.?[0-9]{0,2}";private static String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒","捌", "玖" };private static String[] iunit = { "元", "万", "亿", "万亿" };// 整数部分单位private static String[] dunit = { "角", "分" };// 小数部分单位private static String[] funit = { "", "拾", "佰", "仟" };// 四进制单位public static void main(String[] args) {String[] ary = { "00010001001.01", "005420101020000000.06", "00.70",".00", "1200", "1409.50", "6007.14", "1680.32", "107000.53","16409.02", "325.00", "325.0", "1.", ".3", "." };for (String s : ary) {String r = toUpper(s);System.out.println(r);}}public static String toUpper(String s) {if (!s.matches(reg)) {throw new RuntimeException("参数不合法" + s);}// 在所有前面加0,防止出现split的第一个元素为空的情况,在后面会去掉这个零s = "0" + s;String[] ary = s.split("\\.");// 打印一下将要处理的数据System.out.println(Arrays.toString(ary));String left = "";String right = "";if (ary.length == 1) {// 只有整数left = ary[0];}else {// 有小数left = ary[0];right = ary[1];}String leftUpper = "";String rightUpper = "";// 除去左边的0left = left.replaceAll("^0*", "");if (left.length() > 16) {throw new RuntimeException("最高支持万亿级别");}if (!left.equals("")) {int llen = left.length();int j = 0;int k = 0;boolean flag = true;for (int i = llen - 1; i >= 0; i--) {if (j == 0) {leftUpper = iunit[k] + leftUpper;}if (left.charAt(i) == 48) {if (flag) {}else {leftUpper = digit[left.charAt(i) - 48] + leftUpper;flag = true;}}else {leftUpper = digit[left.charAt(i) - 48] + funit[j]+ leftUpper;flag = false;}if (j == 3) {j = 0;k++;flag = true;}else {j++;}}}if (!right.equals("")) {boolean rflag = false;if (right.length() == 2) {if (right.charAt(1) > 48) {rightUpper = digit[right.charAt(1) - 48] + dunit[1]+ rightUpper;rflag = true;}}if (right.charAt(0) == 48) {if (rflag) {rightUpper = digit[right.charAt(0) - 48] + rightUpper;}}else {rightUpper = digit[right.charAt(0) - 48] + dunit[0]+ rightUpper;}}if (leftUpper.equals("") && rightUpper.equals("")) {return "零元";}if (rightUpper.equals("")) {rightUpper = "整";}return leftUpper + rightUpper;}}

控制台打印结果:

[000010001001, 01]
壹仟万壹仟零壹元零壹分
[0005420101020000000, 06]
伍仟肆佰贰拾万亿壹仟零壹拾亿贰仟万元零陆分
[000, 70]
柒角
[0, 00]
零元
[01200]
壹仟贰佰元整
[01409, 50]
壹仟肆佰零玖元伍角
[06007, 14]
陆仟零柒元壹角肆分
[01680, 32]
壹仟陆佰捌拾元叁角贰分
[0107000, 53]
壹拾万柒仟元伍角叁分
[016409, 02]
壹万陆仟肆佰零玖元零贰分
[0325, 00]
叁佰贰拾伍元整
[0325, 0]
叁佰贰拾伍元整
[01]
壹元整
[0, 3]
叁角
[0]
零元

根据人民币大写规则写的java工具类相关推荐

  1. java工具类怎么写_常用的Java工具类——十六种

    常用的Java工具类--十六种 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选 ...

  2. 干货:排名前 16 的 Java 工具类!

    2019独角兽企业重金招聘Python工程师标准>>> 干货:排名前 16 的 Java 工具类!   在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最 ...

  3. 排名前 16 的 Java 工具类

    转载来自微信公众号:Java 技术栈.如有侵权,请联系作者删除!! 在 Java 中,工具类定义了一组公共方法,这篇文章将介绍 Java 中使用最频繁及最通用的 Java 工具类.以下工具类.方法按使 ...

  4. beanutils工具类_16 个超级实用的 Java 工具类!

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  5. java轻量级并行工具类_16 个超级实用的 Java 工具类

    原标题:16 个超级实用的 Java 工具类 源 /juejin 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名, ...

  6. java 文本工具类_干货:排名前16的Java工具类

    原标题:干货:排名前16的Java工具类 作者丨Java技术栈 https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Ja ...

  7. 干货:排名前16的Java工具类

    image 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源 ...

  8. 排名前16的Java工具类

    原文:https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法 ...

  9. java xml最火的的工具_几种高效的Java工具类推荐

    本文将介绍了十二种常用的.高效的Java工具类 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类. 在开发中,使用这些工具类,不仅可以提高编码效率,还 ...

最新文章

  1. phalapi-进阶篇4(notrom进阶以及事务操作)
  2. python读取大文件-Python如何读取、拆分大文件
  3. 任意进制转换的递归实现
  4. 10个理由告诉你为何要学Java编程?
  5. http协议的各类状态码
  6. Oracle体系结构之控制文件的多路复用技术
  7. mysql 主键个数
  8. 大数据平台基本功能有哪些
  9. MSB与LSB的含义
  10. Alcor(安国)AU6387量产修复(u盘修复)
  11. 一个关于数学归纳法的悖论问题
  12. php 字典树,关于PHP字典树的定义与实现方法
  13. 计算机软件考试——嵌入式系统设计师 知识点汇总
  14. EBS R12.2 ADOP (R12.2 AD Online Patching) - 3
  15. Vim学习笔记一:Vim对文本操作
  16. Android使用VideoView播放视频
  17. WebApp开发中的rem.js
  18. 每日一个小技巧:文字转图片怎么操作?介绍给你三款软件
  19. java.sql.SQLException: 无效的列类型: 1111 报错问题解决
  20. 【算法】超详细的遗传算法(Genetic Algorithm)解析

热门文章

  1. 10 款值得珍藏的 Chrome 浏览器插件
  2. 阿里云购买云服务器流程及注意事项(新用户必看图文教程)
  3. “牵一发而动全身”——我用观察者模式简单模拟吃鸡
  4. 系统分析师-2022年上半年必考知识点
  5. 一连发布三个版本,Boot要上天?
  6. 让女人无法抗拒的30句表白
  7. ETUDE HOUSE伊蒂之屋携手全新中国区品牌大使Justin黄明昊
  8. 日本人的姓及一些姓氏的读法(转)
  9. Linux常用命令汇总 - 近乎全量命令!
  10. 使用Win64OpenSSL_Light生成自签名https授权证书的几个坑