java将数字转简体中文和繁体中文,支持金额模式 您所在的位置:网站首页 10996大写金额 java将数字转简体中文和繁体中文,支持金额模式

java将数字转简体中文和繁体中文,支持金额模式

2023-12-16 22:23| 来源: 网络整理| 查看: 265

最近项目中用到金额转大写的地方,然后hutool里面正好有这个功能。 工具类路径:

cn.hutool.core.convert.Convert#digitToChinese

方法描述:

/** * 金额转为中文形式 * * @param n 数字 * @return 中文大写数字 * @since 3.2.3 */ public static String digitToChinese(Number n) { if(null == n) { return "零"; } return NumberChineseFormatter.format(n.doubleValue(), true, true); }

参数是Number类型,而Bigdecimal也是此类的子类,所以使用Bigdecimal和这个类就可以实现功能了

后来我又看了这个方法的实现,里面调用了NumberChineseFormatter这个类的方法,而这个类又封装了一层方法

cn.hutool.core.convert.NumberChineseFormatter#format(double, boolean, boolean)

这个方法多了两个参数,isUseTraditional和isMoneyMode,分别表示是否使用繁体大写和是否表示金额

/** * 阿拉伯数字转换成中文,小数点后四舍五入保留两位. 使用于整数、小数的转换. * * @param amount 数字 * @param isUseTraditional 是否使用繁体 * @param isMoneyMode 是否为金额模式 * @return 中文 */ public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode) { //此处省略hutool方法体代码 }

isUseTraditional:是否转为繁体。false将阿拉伯数字转为 “一”, “二”, “三"简体形式,true将阿拉伯数字转换为"壹”, “贰”, "叁"繁体形式;

isMoneyMode:是否金额模式。false将数字转为纯中文数字,true将阿拉伯数字转为带"元",“角”,"分"的中文数字。

总结:如果用这个方法,既可以将数字转简体中文,又可以转为金额形式。

应用:

一、将阿拉伯数字序号转为简单中文数字:

List numbers = Arrays.asList(1,2.0,3.31,4.71,5.86); System.out.println("数字转序号:"); numbers.forEach(item ->{ System.out.println(NumberChineseFormatter.format(item.doubleValue(), false, false)); });

控制台输出:

数字转序号:

一 二 三点三一 四点七一 五点八六

二、将阿拉伯金额转为中文大写金额

List numbers = Arrays.asList(1,2.0,3.31,4.71,5.86); System.out.println("数字转金额:"); numbers.forEach(item ->{ System.out.println(NumberChineseFormatter.format(item.doubleValue(), true, true)); });

控制台输出:

数字转金额:

壹元整 贰元整 叁元叁角壹分 肆元柒角壹分 伍元捌角陆分

附:非hutool工具类

import com.guangyi.project.config.BDException; import org.apache.commons.lang3.StringUtils; /** * @Title: ConvertUpMoney * @Description: 将数字金额转换为大写中文金额 * */ public class ConvertUpMoney { // 大写数字 private static final String[] NUMBERS = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; // 整数部分的单位 private static final String[] IUNIT = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟"}; // 小数部分的单位 private static final String[] DUNIT = {"角","分","厘"}; /** * 转换为大写的中文金额 * @param str 字符串类型的 金额数字 * @return */ public static String toChinese(String str) { // 判断输入的金额字符串是否符合要求 if (StringUtils.isBlank(str) || !str.matches("(-)?[\\d]*(.)?[\\d]*")) { throw new BDException("金额不正确"); } if("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) { return "零元"; } // 判断金额数字中是否存在负号"-" boolean flag = false; if(str.startsWith("-")){ // 标志位,标志此金额数字为负数 flag = true; str = str.replaceAll("-", ""); } // 去掉金额数字中的逗号"," str = str.replaceAll(",", ""); String integerStr;//整数部分数字 String decimalStr;//小数部分数字 // 初始化:分离整数部分和小数部分 if(str.indexOf(".")>0) { integerStr = str.substring(0,str.indexOf(".")); decimalStr = str.substring(str.indexOf(".") + 1); }else if(str.indexOf(".")==0) { integerStr = ""; decimalStr = str.substring(1); }else { integerStr = str; decimalStr = ""; } // beyond超出计算能力,直接返回 if(integerStr.length()>IUNIT.length) { return "超出计算能力!"; } // 整数部分数字 int[] integers = toIntArray(integerStr); // 判断整数部分是否存在输入012的情况 if (integers.length>1 && integers[0] == 0) { return "抱歉,输入数字不符合要求!"; } // 设置万单位 boolean isWan = isWan5(integerStr); // 小数部分数字 int[] decimals = toIntArray(decimalStr); // 返回最终的大写金额 String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals); if(flag){ // 如果是负数,加上"负" return "负" + result; }else{ return result; } } /** * 将字符串转为int数组 * @param number 数字 * @return */ private static int[] toIntArray(String number) { int[] array = new int[number.length()]; for(int i = 0;i StringBuffer chineseInteger = new StringBuffer(""); int length = integers.length; if (length == 1 && integers[0] == 0) { return ""; } for(int i=0; i if((length - i) == 13)//万(亿) key = IUNIT[4]; else if((length - i) == 9) {//亿 key = IUNIT[8]; }else if((length - i) == 5 && isWan) {//万 key = IUNIT[4]; }else if((length - i) == 1) {//元 key = IUNIT[0]; } if((length - i)>1 && integers[i+1]!=0) { key += NUMBERS[0]; } } chineseInteger.append(integers[i]==0?key:(NUMBERS[integers[i]]+IUNIT[length - i -1])); } return chineseInteger.toString(); } /** * 将小数部分转为大写的金额 * @param decimals 小数部分的数字 * @return */ private static String getChineseDecimal(int[] decimals) { StringBuffer chineseDecimal = new StringBuffer(""); for(int i = 0;i break; } chineseDecimal.append(decimals[i]==0?"":(NUMBERS[decimals[i]]+DUNIT[i])); } return chineseDecimal.toString(); } /** * 判断当前整数部分是否已经是达到【万】 * @param integerStr 整数部分数字 * @return */ private static boolean isWan5(String integerStr) { int length = integerStr.length(); if(length > 4) { String subInteger = ""; if(length > 8) { subInteger = integerStr.substring(length- 8,length -4); }else { subInteger = integerStr.substring(0,length - 4); } return Integer.parseInt(subInteger) > 0; }else { return false; } } // Test public static void main(String[] args) { String number = "12.56"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "1234567890563886.123"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "1600"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "156,0"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "-156,0"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "0.12"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "0.0"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "01.12"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "0125"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "-0125"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); number = "sdw5655"; System.out.println(number+": "+ConvertUpMoney.toChinese(number)); System.out.println(null+": "+ConvertUpMoney.toChinese(null)); } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有