编程小技巧阿拉伯数字转中文汉字的Java方法
之前做财务相关的系统时,阿拉伯数字需要转换成中文汉字。
当时知识储备不足。一直没有满意的方案。
今天特意思考这个问题,写下此方法,到目前为止算是最满意的方案了。import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class TestNumberToChinese { @Test public void testConvertNumberToChinese() { Assertions.assertArrayEquals(new Object[] { "零元"// , "零元" } // , new Object[] { TestNumberToChinese.convertNumberToChinese("0")// , TestNumberToChinese.convertNumberToChinese("0.00") }); } public static String convertNumberToChinese(String inputData) { Map decimalUnit = new HashMap<>(); decimalUnit.put(-2, "分"); decimalUnit.put(-1, "角"); decimalUnit.put(1, "元"); decimalUnit.put(2, "拾"); decimalUnit.put(3, "佰"); decimalUnit.put(4, "仟"); decimalUnit.put(5, "万"); decimalUnit.put(6, "拾");// 十万 decimalUnit.put(7, "佰");// 佰万 decimalUnit.put(8, "仟");// 仟万 decimalUnit.put(9, "亿"); decimalUnit.put(10, "拾");// 十亿 decimalUnit.put(11, "佰");// 佰亿 decimalUnit.put(12, "仟");// 仟亿 decimalUnit.put(13, "兆"); decimalUnit.put(14, "拾");// 十兆 decimalUnit.put(15, "佰");// 佰兆 decimalUnit.put(16, "仟");// 仟兆 List extraUnit = new ArrayList<>(); extraUnit.add("万"); extraUnit.add("亿"); extraUnit.add("兆"); Map unitCount = new HashMap<>(); unitCount.put(0, "零"); unitCount.put(1, "壹"); unitCount.put(2, "贰"); unitCount.put(3, "叁"); unitCount.put(4, "肆"); unitCount.put(5, "伍"); unitCount.put(6, "陆"); unitCount.put(7, "柒"); unitCount.put(8, "捌"); unitCount.put(9, "玖"); StringBuffer outputBufferData = new StringBuffer(); String integerData = null; String scaleData = null; Pattern decimalPattern = Pattern.compile("^(d{1,16}).(d{0,2})#34;); Matcher decimalMatcher = decimalPattern.matcher(inputData); Pattern integerPattern = Pattern.compile("^(d{1,16})#34;); Matcher integerMatcher = integerPattern.matcher(inputData); if (decimalMatcher.find()) {// 小数的场合 integerData = decimalMatcher.group(1); scaleData = decimalMatcher.group(2); } else if (integerMatcher.matches()) {// 整数的场合 integerData = inputData; } // 转换整数 if (integerData != null && integerData != "") { for (int k = 0; k < integerData.length(); k++) { char inputChar = integerData.charAt(k); int currentUnitCount = Character.getNumericValue(inputChar); String currentUnit = decimalUnit.get(integerData.length() - k); String numToChinese = null; if (currentUnitCount == 0) { numToChinese = unitCount.get(currentUnitCount); if (k == integerData.length() - 1) { numToChinese = unitCount.get(currentUnitCount) + currentUnit; } else if (extraUnit.contains(currentUnit)) { numToChinese = currentUnit; } } else { numToChinese = unitCount.get(currentUnitCount) + currentUnit; } outputBufferData.append(numToChinese); } } // 转换小数 if (scaleData != null && scaleData != "") { for (int k = 0; k < scaleData.length(); k++) { char inputChar = scaleData.charAt(k); int currentUnitCount = Character.getNumericValue(inputChar); String currentUnit = decimalUnit.get(Math.negateExact(k + 1)); String numToChinese = null; if (currentUnitCount == 0) { numToChinese = unitCount.get(currentUnitCount); } else { numToChinese = unitCount.get(currentUnitCount) + currentUnit; } outputBufferData.append(numToChinese); } } String ouputData = outputBufferData.toString(); // 去除重复的零 ouputData = ouputData.replaceAll("(零{2,})", ""); if (!ouputData.equals("零元")) { // 去除不合理的单位 ouputData = ouputData.replaceAll("^(零元)", ""); ouputData = ouputData.replaceAll("(亿万)", "亿"); ouputData = ouputData.replaceAll("(兆亿)", "兆"); // 去除首位的零 ouputData = ouputData.replaceAll("^(零{1})", ""); // 去除末位的零 ouputData = ouputData.replaceAll("(零{1})#34;, ""); } return ouputData; } }
华为Mate50定档明年3月份,双环双主摄居中挖孔,不支持5G最近业内有很多消息表示华为Mate50或将于本月发布,但据相关消息称,华为P50系列刚在7月份发布,Mate系列并不会来得这么快,毕竟两款新机的定位档期会有一定明显的时间间隔,相关
两位化学家夺回诺贝尔化学奖!靠的是你熟悉又陌生的成果当地时间10月6日,瑞典皇家科学院宣布,将2021年诺贝尔化学奖授予本杰明利斯特(BenjaminList)和戴维麦克米伦(DavidW。C。MacMillan),以表彰他们对不对
手机后台耗电量过大怎样关闭?这个问题我来问答吧,因为本人的职业是一个回收废旧手机的小贩,常年回收各种烂手机,因为要卖呀,所以在卖之前要经过各种测试,其中电池耐用与否,这是一部二手手机性能硬件之一,因此杀后是我
匈牙利将建欧洲首个5G智慧铁路港新华社布达佩斯10月5日电(记者袁亮)中国华为匈牙利子公司日前与匈牙利东西联运物流公司及英国电信运营商沃达丰匈牙利公司签署了建设东西门场站的合作协议。该项目将建设欧洲首个使用5G专
投资者对话录(四)投资者甲问你看好小米的理由是什么?关键性的理由。投资者乙答效率。投资者甲问从哪些地方体现?乙答营销支出比例是C端智能硬件公司中最少的。说明企业本身有势能,口碑传播不错坪效仅次于苹果
耳聋戴助听器好吗,真的有用吗?助听器当然好,我是耳模凹陷,神经性耳聋,从一九八九年开始戴助听器,己经三十年了,效果很好。我是作宣传工作的,一九八九年任珲春市委宣传部科长,由于耳朵听力不好,影响工作,单位给我配了
助听器可代购吗,多少钱一台的比较好?你好,助听器是属于二类医疗器械,所以是需要一对一验配的。佩戴助听器前需到专业的助听器验配中心进行验配。验配是指在助听器专业技术人员的指导下选择适合自己听力状况的助听器。每个人的听力
为什么有的人助听器怎么调都听不见?您好,有的人助听器怎么调都调不好是因为1。助听器的效果跟本身的听力损失程度有很大关系,如果这个人的听力损失很重,并且高频下降很厉害,助听器的对高频的补偿是有限的,所以助听器的效果会
新能源车充电难不可小觑国庆假日期间,新能源车主在高速公路服务区排队4小时充电的新闻上了热搜。新能源车充电难问题,再次引发关注。不可否认,车流量陡增是新能源车充电难的一大原因。据国家电网统计,10月1日到
奇瑞新能源不少人说,这一次,瑞虎e的配置,也不是那些遗憾,但实际上,这台车还是很给力的,尤其是在车上,它还是有个性的,比如说它的科技感还是比较强的。而这一代智能手机智能的配置,也成为了新能源
干饭人必备,ERNTE智能料理盒体验上班族们对微波炉一定非常熟悉,每到饭点儿,公司的微波炉前总会排起长长的队伍,只为节省短短的午餐时间,把手头忙不完的工作再赶一赶,但殊不知,工作是永远干不完的,我们需要有健康的身体,