java 将中文数字转为阿拉伯数字

由于项目需求要将中文数字转为阿拉伯数字,找了一些博客有些不满足需求。于是参考了一些博客完成以下代码

/*** 中文数字*/private static char[] cnArr_a = new char [] {'零','一','二','三','四','五','六','七','八','九'};private static char[] cnArr_A = new char [] {'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};private static final String allChineseNum = "零一二三四五六七八九壹贰叁肆伍陆柒捌玖十拾百佰千仟万萬亿";/*** 中文单位*/private static char[] unit_a = new char [] {'亿','万','千','百','十'};private static char[] unit_A = new char [] {'亿','萬','仟','佰','拾'};private static final String allChineseUnit = "十拾百佰千仟万萬亿";/*** 将汉字中的数字转换为阿拉伯数字* (例如:三万叁仟零肆拾伍亿零贰佰萬柒仟陆佰零伍)** @param chineseNum;* @return long*/public static BigDecimal chineseNumToArabicNum(String chineseNum) {// 最终返回的结果BigDecimal result = new BigDecimal(0);if (chineseNum == null || chineseNum.trim().length() == 0) {return result;}char lastUnit = chineseNum.charAt(chineseNum.length() - 1);Boolean appendUnit = true;long lastUnitNum = 1;if (isCnUnit(lastUnit)) {chineseNum = chineseNum.substring(0, chineseNum.length() - 1);lastUnitNum = chnNameValue[chnUnitToValue(String.valueOf(lastUnit))].value;appendUnit = chnNameValue[chnUnitToValue(String.valueOf(lastUnit))].secUnit;}// 将小写中文数字转为大写中文数字for (int i = 0; i < cnArr_a.length; i++) {chineseNum = chineseNum.replaceAll(String.valueOf(cnArr_a[i]), String.valueOf(cnArr_A[i]));}// 将小写单位转为大写单位for (int i = 0; i < unit_a.length; i++) {chineseNum = chineseNum.replaceAll(String.valueOf(unit_a[i]), String.valueOf(unit_A[i]));}for (int i = 0; i < unit_A.length; i++) {if (chineseNum.trim().length() == 0) {break;}String unitUpperCase = String.valueOf(unit_A[i]);String str = null;if (chineseNum.contains(unitUpperCase)) {str = chineseNum.substring(0, chineseNum.lastIndexOf(unitUpperCase) + 1);}if (str != null && str.trim().length() > 0) {// 下次循环截取的基础字符串chineseNum = chineseNum.replaceAll(str, "");// 单位基础值long unitNum = chnNameValue[chnUnitToValue(unitUpperCase)].value;String temp = str.substring(0, str.length() - 1);long number = chnStringToNumber(temp);result = result.add(BigDecimal.valueOf(number).multiply(BigDecimal.valueOf(unitNum)));}// 最后一次循环,被传入的数字没有处理完并且没有单位的个位数处理if (i + 1 == unit_a.length && !"".equals(chineseNum)) {long number = chnStringToNumber(chineseNum);if (!appendUnit) {number = BigDecimal.valueOf(number).multiply(BigDecimal.valueOf(lastUnitNum)).longValue();}result = result.add(BigDecimal.valueOf(number));}}// 加上单位if (appendUnit && lastUnitNum > 1) {result = result.multiply(BigDecimal.valueOf(lastUnitNum));} else if (lastUnitNum > 0) {if (result.compareTo(BigDecimal.ZERO) == BigDecimal.ZERO.intValue()) {result = BigDecimal.ONE;result = result.multiply(BigDecimal.valueOf(lastUnitNum));}}return result;}/*** 返回中文数字汉字所对应的阿拉伯数字,若str不为中文数字,则返回-1** @param string;* @return int*/private static int strToNum(String string){for(int i = 0;i<cnArr_a.length;i++){if (Objects.equals(string,String.valueOf(cnArr_a[i])) || Objects.equals(string,String.valueOf(cnArr_A[i]))){return i;}}return -1;}/*** 判断传入的字符串是否全是汉字数字和单位** @param chineseStr;* @return boolean*/public static boolean isCN_Num_All(String chineseStr){if (isBlank(chineseStr)){return true;}char [] charArray = chineseStr.toCharArray();for(char c : charArray){if (!allChineseNum.contains(String.valueOf(c))) {return false;}}return true;}/*** 判断传入的字符是否是汉字数字和单位** @param chineseChar;* @return boolean*/public static boolean isCN_Num(char chineseChar) {if (!allChineseNum.contains(String.valueOf(chineseChar))) {return false;}else{return true;}}/*** 判断是否是中文单位** @param unitStr;* @return boolean*/public static boolean isCN_Unit(char unitStr) {if (!allChineseUnit.contains(String.valueOf(unitStr))) {return false;}else{return true;}}/*** 中文转换成阿拉伯数字,中文字符串除了包括0-9的中文汉字,还包括十,百,千,万等权位。* 此处是完成对这些权位的类型定义。* name是指这些权位的汉字字符串。* value是指权位多对应的数值的大小。诸如:十对应的值的大小为10,百对应为100等* secUnit若为true,代表该权位为节权位,即万,亿,万亿等*/public static class Chn_Name_value{String name;long value;Boolean secUnit;Chn_Name_value(String name,long value,Boolean secUnit){this.name=name;this.value=value;this.secUnit=secUnit;}}static Chn_Name_value chnNameValue[] = {new Chn_Name_value("十",10,false),new Chn_Name_value("拾",10,false),new Chn_Name_value("百",100,false),new Chn_Name_value("佰",100,false),new Chn_Name_value("千",1000,false),new Chn_Name_value("仟",1000,false),new Chn_Name_value("万",10000,true),new Chn_Name_value("萬",10000,true),new Chn_Name_value("亿",100000000,true)};/*** 返回中文汉字权位在chnNameValue数组中所对应的索引号,若不为中文汉字权位,则返回-1** @param str;* @return int*/private static int ChnUnitToValue(String str){for(int i=0;i<chnNameValue.length;i++){if(str.equals(chnNameValue[i].name)){return i;}}return -1;}/*** 返回中文数字字符串所对应的int类型的阿拉伯数字* (千亿/12位数)** @param str;* @return long*/private static long ChnStringToNumber(String str){long returnNumber=0;long section=0;int index=0;long number=0;while (index<str.length()){// 从左向右依次获取对应中文数字,取不到返回-1int num = strToNum(str.substring(index,index+1));//若num>=0,代表该位置(pos),所对应的是数字不是权位。若小于0,则表示为权位if(num >= 0){number = num;index++;//pos是最后一位,直接将number加入到section中。if(index>=str.length()){section += number;returnNumber += section;break;}}else{int chnNameValueIndex=ChnUnitToValue(str.substring(index,index+1));//chnNameValue[chnNameValueIndex].secUnit==true,表示该位置所对应的权位是节权位,if(chnNameValue[chnNameValueIndex].secUnit){section = (section + number) * chnNameValue[chnNameValueIndex].value;returnNumber += section;section=0;}else{section += number*chnNameValue[chnNameValueIndex].value;}index++;number=0;if(index>=str.length()){returnNumber += section;break;}}}return returnNumber;}public static void main(String[] args) {String str = "三万叁仟零肆拾伍亿零贰佰萬柒仟陆佰零伍万";String str1 = "三万叁仟零肆拾伍亿零贰佰萬柒仟陆佰零伍";String str2 = "三万叁仟零肆拾伍亿零柒仟陆佰零伍";String str3 = "三仟零肆十万";String str4 = "三万三千";String str5 = "三万零四十";String str6 = "三万叁仟零肆拾伍亿";String str7 = "十";String str8 = "一百";String str9 = "一百零一";String str10 = "一千";String str11 = "一千零一";String str12 = "一千零一十";System.out.println();System.out.println(">>> " + str + " : " + chineseNumToArabicNum(str));System.out.println(">>> " + str1 + " : " + chineseNumToArabicNum(str1));System.out.println(">>> " + str2 + " : " + chineseNumToArabicNum(str2));System.out.println(">>> " + str3 + " : " + chineseNumToArabicNum(str3));System.out.println(">>> " + str4 + " : " + chineseNumToArabicNum(str4));System.out.println(">>> " + str5 + " : " + chineseNumToArabicNum(str5));System.out.println(">>> " + str6 + " : " + chineseNumToArabicNum(str6));System.out.println(">>> " + str7 + " : " + chineseNumToArabicNum(str7));System.out.println(">>> " + str8 + " : " + chineseNumToArabicNum(str8));System.out.println(">>> " + str9 + " : " + chineseNumToArabicNum(str9));System.out.println(">>> " + str10 + " : " + chineseNumToArabicNum(str10));System.out.println(">>> " + str11 + " : " + chineseNumToArabicNum(str11));System.out.println(">>> " + str12 + " : " + chineseNumToArabicNum(str12));System.out.println();}

运行结果

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200121163617830.png
写的不好,还望包涵
希望对各位有所帮助
如有缺漏,还望个位大神指出

参考文档
https://www.jianshu.com/p/033d7aadba30

java 将中文数字转阿拉伯数字相关推荐

  1. java中文数字改阿拉伯数字_[Java教程]Java实现中文数字转换为阿拉伯数字

    [Java教程]Java实现中文数字转换为阿拉伯数字 0 2015-05-19 16:00:20 /** * 中文數字转阿拉伯数组[十万九千零六十 --> 109060] * @author 雪 ...

  2. java中文数字与阿拉伯数字相互转换

    最近有一个业务需要用到中文数字与阿拉伯数字相互转换,废话不多说直接上代码. 中文数字/阿拉伯数字互转第一次完善:https://blog.csdn.net/qq_26896085/article/de ...

  3. 使用cn2an实现中文数字与阿拉伯数字的相互转换

    工作中经常遇到阿拉伯数字转换称为中文数字或者大写金额,在网上搜了下,cn2an口碑较好,遂进行了一番学习. 安装 pip install cn2an 依赖库为setuptools.PyYAML 查看版 ...

  4. 中文数字与阿拉伯数字的转换

    工作中,中文大写数字/金额需要转为阿拉伯数字,原本自己写的解析转换太麻烦. 忽然发现有做好的模块cn2an: 优点: 1.可以直接识别句子中的中文数字,省去写re   2.不同的匹配模式控制精确度 缺 ...

  5. python数字转中文字符_Python实现中文数字转换为阿拉伯数字的方法示例

    本文实例讲述了Python实现中文数字转换为阿拉伯数字的方法.分享给大家供大家参考,具体如下: 一.需求 今天写了三千二百行代码. 今天写了3200行代码. 两行意思相同,只是表达方式不太能够,统一掉 ...

  6. python数字转换_Python实现中文数字转换为阿拉伯数字的方法示例

    本文实例讲述了Python实现中文数字转换为阿拉伯数字的方法.分享给大家供大家参考,具体如下: 一.需求 今天写了三千二百行代码. 今天写了3200行代码. 两行意思相同,只是表达方式不太能够,统一掉 ...

  7. 中文数字与阿拉伯数字转换(Python)

    cn2an 是一个快速转化 中文数字 和 阿拉伯数字 的工具包 相关链接 cn2an工具包Github地址 在线测试平台 install git clone https://github.com/Ai ...

  8. android数字转汉字,【原创】最精简的中文数字和阿拉伯数字互相转换函数

    public class ChineseNumUtils { /** * 中文数字转阿拉伯数字 * (长度不能超过long最大值) * * @param chNum 中文数字 * @return 阿拉 ...

  9. c# 中文数字转阿拉伯数字

    最近迷上了看网络小说,手机上的小说阅读器全都是收费的,所以决定下载下载再导入到手机上,可是能下载到的现成的TXT格式小说全都被打了广告,仔细看的时候像一些"首"."发&q ...

最新文章

  1. 0x41.数据结构进阶 - 并查集
  2. 华为服务器修改SN,服务器渠道货SN配置
  3. 二分图的最大匹配(匈牙利算法)HDU1083
  4. keytool安装tls证书_TLS使用指南(一):如何在Rancher 2.x中进行TLS终止?
  5. 多项式对数函数ln f(x)
  6. PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现
  7. 设计模式学习总结——工厂模式
  8. 谷粒商城基础篇爬坑笔记--项目导入intellij IDEA后pom.xml无法识别为maven文件和程序包import com.atguigu.common.XXX不存在两个问题解决方法
  9. mysql count 条件_MySQL的COUNT语句,竟然都能被面试官虐的这么惨?
  10. Android刷机Windows10,蓝魔i9s Win10+Android双系统的刷机教程及固件下载
  11. 数据库基础(超详细版)
  12. 哈夫曼编码问题(贪心算法)
  13. 主板检测卡c5_用诊断卡 搞定主板故障
  14. as常用固定搭配_初中英语常用固定搭配
  15. 怎么将DWG文件有效转换为PDF文件
  16. 《创造成功本能》 博客思听 2011年2月
  17. matlab 传函将s换为jw,2010MATLAB及控制系统仿真_总复习.ppt
  18. 做自己喜欢做的事,需要勇气,也需要能力
  19. Block Recurrent Transformer:结合了LSTM和Transformer优点的强大模型
  20. html 页面地图不显示图片,Html显示地图 - 切切歆语的个人页面 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. linux查看网卡驱动文件夹,Linux网卡驱动类型
  2. 程序员的算法趣题pdf
  3. 技术答疑丨如何区分游戏短音乐与音效以及配音
  4. c语言中sqrt函数_sqrt()函数以及C ++中的示例
  5. 操作系统-请编程建立 3 个并发协作进程,它们分别完成 f(x,y)、f(x)、f(y)
  6. 【调剂】西北师范大学计算机科学与工程学院 2023年硕士研究生调剂公告
  7. 点菜java_java点菜系统代码
  8. 韩语计算机术语大全,韩语常用电脑词汇
  9. iphone各个型号屏幕分辨率
  10. 从DIY想到的面向对象的思想