1、工具

public class RmbUtils {private RmbUtils() {}/*** 汉语中数字大写*/private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆","伍", "陆", "柒", "捌", "玖" };/*** 汉语中货币单位大写,这样的设计类似于占位符*/private static final String[] CN_UPPER_MONETRAY_UNIT = {"分", "角", "圆","拾", "佰", "仟", "万","拾", "佰", "仟", "亿","拾", "佰", "仟", "兆","拾", "佰", "仟", "京","拾", "佰", "仟", "垓","拾", "佰", "仟", "杼","拾", "佰", "仟", "穰","拾", "佰", "仟", "沟","拾", "佰", "仟", "涧","拾", "佰", "仟", "正","拾", "佰", "仟", "载","拾", "佰", "仟", "极","拾", "佰", "仟" };/*** 特殊字符:整*/private static final String CN_FULL = "整";/*** 特殊字符:负*/private static final String CN_NEGATIVE = "负";/*** 金额的精度,默认值为2*/private static final int MONEY_PRECISION = 2;/*** 特殊字符:零元整*/private static final String CN_ZEOR_FULL = "零元" + CN_FULL;private static final String REGEX = "-?([1-9][0-9]{0,51})|0|([0]\\.[0-9]{1,2})|([1-9][0-9]{0,51}\\.[0-9]{1,2})";public static String rmbUpperWithZero(String numberOfMoney)throws Exception {return rmbUpper(numberOfMoney, true);}public static String rmbUpperWithoutZero(String numberOfMoney) throws Exception {return rmbUpper(numberOfMoney, false);}public static String rmbUpper(String numberOfMoney, boolean withZero) throws Exception {if(!numberOfMoney.matches(REGEX)){throw new Exception("金额格式错误!");}return rmbUpperBigDecimal(new BigDecimal(numberOfMoney), withZero);}/*** 把输入的金额转换为汉语中人民币的大写** @param numberOfMoney*            输入的金额*         withZero 505000  是否带0,true:50万零五千,false:则是50万五千* @return 对应的汉语大写*/private static String rmbUpperBigDecimal(BigDecimal numberOfMoney, boolean withZero) {StringBuffer sb = new StringBuffer();// -1, 0, or 1 as the value of this BigDecimal is negative, zero, or// positive.int signum = numberOfMoney.signum();// 零元整的情况if (signum == 0) {return CN_ZEOR_FULL;}//这里会进行金额的四舍五入BigDecimal number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0, RoundingMode.DOWN).abs();// 得到小数点后两位值long scale = number.remainder(new BigDecimal(100)).longValue();int numUnit = 0;int numIndex = 0;boolean getZero = false;// 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11if (!(scale > 0)) {numIndex = 2;number = number.divide(new BigDecimal(100), 0, RoundingMode.DOWN);getZero = true;}if (scale > 0 && (scale % 10 == 0)) {numIndex = 1;number = number.divide(new BigDecimal(10), 0, RoundingMode.DOWN);getZero = false;}int zeroSize = 0;int beginUnit = 0; //跨单位计算while (true) {if (number.compareTo(new BigDecimal(0)) == 0) {break;}// 每次获取到最后一个数numUnit = number.remainder(new BigDecimal(10)).intValue();if (numUnit > 0) {if ( beginUnit >= 4 && numIndex - beginUnit != 2 &&!withZero) {sb.insert(0, CN_UPPER_NUMBER[0]);sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex - ((numIndex - 2) % 4)]);}if ((numIndex == 9) && (zeroSize >= 3)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);}if ((numIndex == 13) && (zeroSize >= 3)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);}sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);sb.insert(0, CN_UPPER_NUMBER[numUnit]);getZero = false;zeroSize = 0;beginUnit = 0;} else {++zeroSize;boolean isAdd = false;if (beginUnit > 0 && !withZero) {isAdd = true;beginUnit += 1;}if (!(getZero)) {if ((numIndex - 2) % 4 == 0 && !withZero) {if (!isAdd) {beginUnit += 1;}} else {sb.insert(0, CN_UPPER_NUMBER[numUnit]);}}if (numIndex == 2) {if (number.compareTo(new BigDecimal(0)) > 0) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);}} else if (((numIndex - 2) % 4 == 0) && number.remainder(new BigDecimal(1000)).intValue() > 0) {if (beginUnit < 4) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);}}getZero = true;}// 让number每次都去掉最后一个数number = number.divide(new BigDecimal(10), 0, RoundingMode.DOWN);++numIndex;}// 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负if (signum == -1) {sb.insert(0, CN_NEGATIVE);}// 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整if (!(scale > 0)) {sb.append(CN_FULL);}return sb.toString();}/*** 把输入的金额转换为汉语中人民币的大写** @param numberOfMoney*            输入的金额*         withZero 505000  是否带0,true:50万零五千,false:则是50万五千* @return 对应的汉语大写*/private static String rmbUpperLong(BigDecimal numberOfMoney, boolean withZero) {StringBuffer sb = new StringBuffer();// -1, 0, or 1 as the value of this BigDecimal is negative, zero, or// positive.int signum = numberOfMoney.signum();// 零元整的情况if (signum == 0) {return CN_ZEOR_FULL;}//这里会进行金额的四舍五入long number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0, 4).abs().longValue();// 得到小数点后两位值long scale = number % 100;int numUnit = 0;int numIndex = 0;boolean getZero = false;// 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11if (!(scale > 0)) {numIndex = 2;number = number / 100;getZero = true;}if (scale > 0 && (scale % 10 == 0)) {numIndex = 1;number = number / 10;getZero = false;}int zeroSize = 0;int beginUnit = 0; //跨单位计算while (true) {if (number <= 0) {break;}// 每次获取到最后一个数numUnit = (int) (number % 10);if (numUnit > 0) {if (beginUnit >= 4 && !withZero) {sb.insert(0, CN_UPPER_NUMBER[0]);sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex - ((numIndex - 2) % 4)]);}if ((numIndex == 9) && (zeroSize >= 3)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);}if ((numIndex == 13) && (zeroSize >= 3)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);}sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);sb.insert(0, CN_UPPER_NUMBER[numUnit]);getZero = false;zeroSize = 0;beginUnit = 0;} else {++zeroSize;if (beginUnit > 0 && !withZero) {beginUnit += 1;}if (!(getZero)) {if ((numIndex - 2) % 4 == 0 && !withZero) {beginUnit += 1;} else {sb.insert(0, CN_UPPER_NUMBER[numUnit]);}}if (numIndex == 2) {if (number > 0) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);}} else if (((numIndex - 2) % 4 == 0) && number % 1000 > 0) {if (beginUnit < 4) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);}}getZero = true;}// 让number每次都去掉最后一个数number = number / 10;++numIndex;}// 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负if (signum == -1) {sb.insert(0, CN_NEGATIVE);}// 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整if (!(scale > 0)) {sb.append(CN_FULL);}return sb.toString();}}

JAVA工具【八】RmbUtils 人民币大小写转换工具相关推荐

  1. 人民币大小写转换工具类

    package com.test.util;import java.io.BufferedReader; import java.io.InputStreamReader;public final c ...

  2. JavaScript实现人民币大小写转换

    当使用支票或者签署合同时,需要用到大写人民币,常用的中文大写包括零.壹.贰.叁.肆.伍.陆.柒.捌.玖.拾.佰.仟.万.亿.本文介绍下如何使用JavaScript实现将阿拉伯数字的人民币转换成大写. ...

  3. 金额大小写转换工具类

    /***金额大小写转换工具类*/public class MoneyUtil {/** 大写数字 */private static final String[] NUMBERS = { "零 ...

  4. Java实现人民币大小写转换

    思路和具体方法都在注释中说明 package ClassicArithmetic;import java.util.Scanner;/** @author:LOHAS翀* @time:2019/11/ ...

  5. html5制作大小写转换,Convert Case - 英文大小写转换工具

    Convert Case - 英文大小写转换工具背景介绍 大家在敲键盘.输入文字的时候是会看着屏幕的吗?或许有些人会盯着键盘,从中找到自己要使用的按键,但这有可能发生一个常见问题是没有切换到适当输入法 ...

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

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

  7. 首字母大写转换 java,Java InitialsTransformation(字符串首字母大小写转换)

    版权声明:本文为原创博文,最终解释权归一个集 帅气 与 智慧 和 手速 于一身的男人-灭世奶神-所有!- - - - - - - - - - - - -转载:请附上--源作者 / 源博文--相关链接信 ...

  8. Oracle存储过程实现人民币大小写转换

    注意:当报如下错误时,是因为存储过程中定义的变量值太小,加大它的范围即可. Caused by: java.sql.SQLException: ORA-06502: PL/SQL: 数字或值错误 :  ...

  9. java 字母大写_Java字母大小写转换的方法

    案例: 要求从控制台接收用户输入的一个字母,如果这个字母是小写,转换为大写:如果这个字母是大写,转换为小写:只能输入字母,如果是其他值,提示数据有误! 实现代码: import java.util.S ...

最新文章

  1. tracert路由跟踪工具使用方法
  2. 2017年4月11日
  3. linux 安装 mysql 5.6_Linux安装MySQL_5.6
  4. nw.js启动时白屏
  5. 计算机系统 程序和指令
  6. 处理SAP Netweaver gateway service使用过程中遇到的404 error
  7. 网页转图片 java_java-网页转图片
  8. 聊透分布式系统一致性
  9. 一文学会JVM常见参数设置+调优经验(JDK1.8)
  10. ios java 加密_AES加密 - iOS与Java的同步实现
  11. matlab有参函数,定义含参量函数 matlab
  12. consul服务下线通知_服务注册中心如何实现秒级服务上下线通知 | SOFARegistry 解析...
  13. c# 导出Excel
  14. html工资计算页面模板,工资计算.html
  15. 声音分贝测试软件源码,C# 电脑录音 实例源码(根据声音分贝大小自动录制)
  16. 软件测试与软件质量模型
  17. css怎么设置图片卷角效果,CSS3 带分隔线卷角贴纸效果
  18. 训练赛一:bfs广搜题目 CF115B Lawnmower
  19. 机器学习:Logistic回归介绍
  20. 微信公众号及小程序开发入门(二)

热门文章

  1. 如何在html网页中利用css实现动画效果
  2. 计算机主板常用英语,[分享]计算机术语 主板类
  3. 主板上集成显卡的计算机在进行显示工作,如何在主板集成显卡和独立显卡之间切换?计算机技术...
  4. Columbia Biosciences 山羊抗美洲驼 IgG:SureLight APC
  5. R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象
  6. java分页展示_Java实现分页展示
  7. Deer计划(2)cloudcompare解析--八叉树
  8. moment常用用法详解
  9. python读取文件数据恢复软件_python深度学习pdf恢复
  10. 原来面试成功的程序员简历都是这样写的