新手学JAVA,看到别人写的好多数字和汉字之间的转换,一时心痒痒,就写了一个可以实现中文汉语数字和阿拉伯数字、人民币大小写之间的互相转换,发出来供大家检验和参考。

我写的这个转换代码有以下几个特点:

1、转换没有限制:支持小数转换、支持正负数转换,无论多长的数字都能转换过来,前提是你的书写格式要正确;

2、转换比较全面,不仅有数字转换汉字,还有汉字转换数字,更有人民币大小写转换;

3、全部转换方法采用static修饰,方面其它类调用(直接用“类名+方法名”调用);

4、虽然代码较长,但是自我感觉充分考虑了性能,尽量减少字符串的使用,相信运行速度还是能接受的;

5、所有异常(一般是传入参数格式错误导致的)参数统一设置为IllegalArgumentException类异常,调试时可注释掉;

6、由于是新手,注释会不太规范,结构也不是很合理,或许很难看懂,也有可能会有不少BUG,一经发现我会及时更新。

欢迎大家提出宝贵的意见建议!

import java.util.HashMap;
import java.util.Map;/*** 工具类,用于汉语数字和阿拉伯数字、RMB大小写之间的相互转换;* 阿拉伯数字转换汉语数字:String chinese = TranslateNumber.numberToChinese("-105.263");* 汉语数字转换阿拉伯数字:String number = TranslateNumber.chineseToNumber("负一百零五点二六三");* 人民币小写转换大写:String rmbWords = TranslateNumber.figuresToWords("15.23元");* 人民币大写转换小写:String rmbFigures = TranslateNumber.wordsToFigures("壹拾伍元贰角叁分");* @author ywfpclt@qq3462907* @version 1.1* 2020-4-13 更新日志:修复了部分bug,避免出现“-0元”的翻译结果*/
public class TranslateNumber {public static String numberToChinese(String in) {/*** 阿拉伯数字转换汉语数字* @param 阿拉伯数字* @return 汉语数字*/String[] ch = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };StringBuilder out = new StringBuilder();// 定义返回值变量StringBuilder integer = new StringBuilder(in);// 定义整数部分,假设传入参数为整数try {// 将所有异常统一设置为“传入参数错误”异常if (in.indexOf('.') != -1) {// 判断是否存在小数out.append(in.substring(in.indexOf('.') + 1));// 截取小数部分字符串integer.delete(in.indexOf('.'), in.length());// 整数部分删除“.”及后面部分字符串/*** 分类转换小数部分*/for (int i = out.length() - 1; i >= 0; i--) {if (i == out.length() - 1 && out.charAt(i) == '0') {out.deleteCharAt(i);// 删除后缀“0”} else {out.setCharAt(i, ch[out.charAt(i) - '0'].charAt(0));}}if (out.length() > 0) {out.insert(0, '点');// 如果小数部分不为0则添加小数点}}ch[0] = "";// 转换整数部分时“零”显示为空字符串out.insert(0, numToCh(integer, ch));// 调用整数部分转换方法转换整数部分} catch (Exception e) {throw new IllegalArgumentException("For input string:" + in);}if (out.toString().equals("负零")) {out.deleteCharAt(0);}return out.toString();}public static String chineseToNumber(String in) {/*** 汉语数字转换阿拉伯数字* @param 汉语数字* @return 阿拉伯数字*/Map<Character, Integer> nums = new HashMap<>();nums.put('〇', 0);nums.put('零', 0);nums.put('一', 1);nums.put('二', 2);nums.put('三', 3);nums.put('四', 4);nums.put('五', 5);nums.put('六', 6);nums.put('七', 7);nums.put('八', 8);nums.put('九', 9);StringBuilder out = new StringBuilder();// 定义返回值变量StringBuilder integer = new StringBuilder(in);// 定义整数部分,假设传入参数为整数try {// 将所有异常统一设置为“传入参数错误”异常if (in.indexOf('点') != -1) {// 判断是否存在小数out.append(in.substring(in.indexOf('点') + 1));// 截取小数部分字符串integer.delete(in.indexOf('点'), in.length());// 整数部分删除“点”及后面部分字符串/*** 转换小数部分*/for (int i = out.length() - 1; i >= 0; i--) {if (i == out.length() - 1 && out.charAt(i) == '零') {out.deleteCharAt(i);// 删除后缀“0”} else {out.setCharAt(i, (char) (nums.get(out.charAt(i)) + '0'));}}if (out.length() > 0) {out.insert(0, '.');// 如果小数部分不为0则添加小数点}}out.insert(0, chToNum(integer, nums));// 调用整数部分转换方法转换整数部分} catch (Exception e) {throw new IllegalArgumentException("For input string:" + in);}if (out.toString().equals("-0")) {out.deleteCharAt(0);}return out.toString();}public static String figuresToWords(String in) {/*** 人民币小写转换大写* @param 人民币小写数字* @return 人民币大写数字*/String[] ch = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };StringBuilder out = new StringBuilder();// 定义返回值变量StringBuilder integer = new StringBuilder(in);// 定义整数部分,假设传入参数为整数if (in.endsWith("元")) {integer.deleteCharAt(integer.length() - 1);// 删除末尾的“元”字}try {// 将所有异常统一设置为“传入参数错误”异常if (integer.indexOf(".") != -1) {// 按“.”分割整数和小数部分out.append(integer.substring(integer.indexOf(".") + 1));// 截取小数部分字符串integer.delete(integer.indexOf("."), in.length());// 整数部分删除“.”及后面部分字符串/*** 分类转换小数部分*/switch (out.length()) {case 1:// 一位小数if (out.charAt(0) != '0') {out.append(ch[out.charAt(0) - '0'] + '角');}out.deleteCharAt(0);break;case 2:// 两位小数if (out.charAt(1) != '0') {out.append(ch[out.charAt(1) - '0'] + '分');}out.deleteCharAt(1);if (out.charAt(0) == '0') {if (out.length() > 1) {out.insert(1, '零');}} else {out.insert(1, ch[out.charAt(0) - '0'] + '角');}out.deleteCharAt(0);break;default:// 超过两位小数则抛出“传入参数错误”异常throw new Exception();}}ch[0] = "";// 转换整数部分时“零”显示为空字符串String integerOut = numToCh(integer, ch);// 转换整数部分switch (integerOut) {// 分类合并整数与小数部分case "零":// 整数为0时if (out.length() == 0) {// 小数为0时out.append("零元整");} else if (out.charAt(0) == '零') {// 小数为0角X分时out.deleteCharAt(0);}break;case "负零":// 整数为-0时if (out.length() == 0) {// 小数为0时out.append("零元整");} else {if (out.charAt(0) == '零') {// 小数为0角X分时out.deleteCharAt(0);}out.insert(0, '负');}break;default:// 整数不为0时if (out.length() == 0) {// 小数为0时out.append(integerOut).append("元整");} else {// 小数不为0时out.insert(0, '元').insert(0, integerOut);}break;}} catch (Exception e) {throw new IllegalArgumentException("For input string:" + in);}return out.toString();}public static String wordsToFigures(String in) {/*** 人民币大写转换小写* @param 人民币大写数字* @return 人民币小写数字*/Map<Character, Integer> nums = new HashMap<>();nums.put('零', 0);nums.put('壹', 1);nums.put('贰', 2);nums.put('叁', 3);nums.put('肆', 4);nums.put('伍', 5);nums.put('陆', 6);nums.put('柒', 7);nums.put('捌', 8);nums.put('玖', 9);StringBuilder out = new StringBuilder();// 定义返回值变量StringBuilder integer = new StringBuilder(in);// 定义整数部分,假设传入参数为整数int decimalNum = 0;// 小数部分数值if (in.endsWith("整") || in.endsWith("正")) {integer.deleteCharAt(integer.length() - 1);// 删除末尾的“整”字}try {// 将所有异常统一设置为“传入参数错误”异常String decimal = new String();// 定义小数部分字符串if (integer.indexOf("元") != -1) {// 按“元”分割整数和小数部分decimal = integer.substring(integer.indexOf("元") + 1);// 截取小数部分字符串integer.delete(integer.indexOf("元"), integer.length());// 整数部分删除“元”及后面部分字符串} else if (integer.indexOf("角") != -1 || integer.indexOf("分") != -1) {if (integer.charAt(0) == '负' || integer.charAt(0) == '正') {// 带负不带负判断decimal = integer.substring(1, integer.length());integer.delete(1, integer.length());} else {decimal = integer.toString();integer.delete(0, integer.length());}}/*** 分类转换小数部分*/switch (decimal.length()) {case 0:// 整数类型不执行任何操作break;case 2:// X角或X分类型if (decimal.charAt(1) == '角') {decimalNum = nums.get(decimal.charAt(0)) * 10;} else if (decimal.charAt(1) == '分') {decimalNum = nums.get(decimal.charAt(0));} else {throw new Exception();}break;case 3:// 零X分类型:if (decimal.charAt(0) == '零') {if (decimal.charAt(2) == '分') {decimalNum = nums.get(decimal.charAt(1));} else {throw new Exception();}} else {throw new Exception();}break;case 4:// X角X分类型if (decimal.charAt(1) == '角' && decimal.charAt(3) == '分') {decimalNum = nums.get(decimal.charAt(0)) * 10 + nums.get(decimal.charAt(2));} else {throw new Exception();}break;default:// 其余类型则抛出“输入参数错误”异常throw new Exception();}out.append(chToNum(integer, nums));// 调用整数部分转换方法转换整数部分if (decimalNum > 0) {out.append('.').append(String.format("%02d", decimalNum));// 如果小数部分不为0则添加小数部分}out.append('元');} catch (Exception e) {throw new IllegalArgumentException("For input string:" + in);}if (out.toString().equals("-0元")) {out.deleteCharAt(0);}return out.toString();}private static String numToCh(StringBuilder in, String[] ch) throws Exception {/*** 私有方法:阿拉伯整数数字转换汉语数字* @param 阿拉伯整数数字,汉语数字1-9名称的数组* @return 汉语数字*/StringBuilder out = new StringBuilder();// 定义返回值变量if (in.indexOf("-") == 0 || in.indexOf("+") == 0) {// 正负数判断// 如果有正负号则用递归方法先转换数字部分,再添加正负号if (in.indexOf("-", 1) == -1 && in.indexOf("+", 1) == -1) {char sign = in.charAt(0);out.append(numToCh(in.deleteCharAt(0), ch));if (sign == '-') {out.insert(0, '负');}} else {throw new Exception();}} else {// 转换整数部分int n = 0;// 计算单位“亿”的个数while (in.length() > 0) {int index = in.length() > 8 ? in.length() - 8 : 0;int intNum = Integer.parseInt(in.substring(index, in.length()));if (intNum > 0) {if (intNum % 10 == 0 && out.length() > 0) {if (out.charAt(0) != '零') {out.insert(0, '零');}}for (int i = 0; i < n; i++) {out.insert(0, '亿');}out.insert(0, numToCh(intNum, ch));} else {if (out.length() > 0 && out.charAt(0) != '零') {out.insert(0, '零');}}n++;in.delete(index, in.length());}}if (out.length() > 1) {if (out.charAt(0) == '零') {out.deleteCharAt(0);}} else if (out.length() == 0) {out.append('零');}return out.toString();}private static String numToCh(int in, String[] ch) throws Exception {/*** 私有方法:亿以下阿拉伯整数数字转换汉语数字* @param 亿以下数值型阿拉伯整数数字,汉语数字1-9名称的数组* @return 汉语数字*/StringBuilder out = new StringBuilder();if (in < 10000) {// 万以下数字转换if (!ch[1].equals("壹") && in < 20 && in >= 10) {out.append('十').append(ch[in % 10]);} else {char[] num = String.valueOf(in).toCharArray();String[] units = { "", "十", "百", "千" };if (ch[1].equals("壹")) {units[1] = "拾";units[2] = "佰";units[3] = "仟";}for (int i = 0; i < num.length; i++) {if (num[num.length - i - 1] == '0') {if (!(out.length() == 0 || out.charAt(0) == '零')) {out.insert(0, '零');}} else {out.insert(0, units[i]);out.insert(0, ch[(int) num[num.length - i - 1] - (int) '0']);}}}} else {// 万以上数字转换out.append(numToCh(in % 10000, ch));if (out.length() > 0 && (in % 10000 < 1000 || in / 10000 % 10 == 0)) {out.insert(0, '零');}out.insert(0, '万');out.insert(0, numToCh(in / 10000, ch));}return out.toString();}private static String chToNum(StringBuilder in, Map<Character, Integer> nums) throws Exception {/*** 私有方法:汉语整数数字转换阿拉伯数字* @param 汉语整数数字,1-9汉语和阿拉伯数字名称对照表集合* @return 阿拉伯整数数字*/StringBuilder out = new StringBuilder();if (in.indexOf("负") == 0 || in.indexOf("正") == 0) {// 正负数判断// 如果有正负号则用递归方法先转换数字部分,再添加正负号if (in.indexOf("负", 1) == -1 && in.indexOf("正", 1) == -1) {char sign = in.charAt(0);out.append(chToNum(in.deleteCharAt(0), nums));if (sign == '负') {out.insert(0, '-');}} else {throw new Exception();}} else {// 转换数字部分for (int i = 0; i < in.length(); i++) {if (in.charAt(i) == '零' && i != in.length() - 1) {in.deleteCharAt(i);// 去掉所有前缀“零”i--;} else if ((in.charAt(i) == '十') && (i == 0 || !nums.containsKey(in.charAt(i - 1)))) {in.insert(i, '一');// 将“十”改为“一十”i++;} else if ((in.charAt(i) == '拾') && (i == 0 || !nums.containsKey(in.charAt(i - 1)))) {in.insert(i, '壹');// 将“拾”改为“壹拾”i++;}}while (in.length() > 0) {// 从右到左以“亿”为界分段转换int n = 0;// 统计字符串尾部“亿”的个数while (in.charAt(in.length() - 1) == '亿') {n++;in.deleteCharAt(in.length() - 1);}while (out.length() < n * 8) {// 按“亿”的个数补足位数out.insert(0, '0');}int index = in.lastIndexOf("亿");out.insert(0, chToNum(in.substring(index + 1), nums));in.delete(index + 1, in.length());}}if (out.length() == 0) {out.append('0');// 转换数字为空则转换为“零”}return out.toString();}private static int chToNum(String in, Map<Character, Integer> num) throws Exception {/*** 私有方法:亿以下汉语整数数字转换阿拉伯数字* @param 亿以下汉语整数数字,1-9汉语和阿拉伯数字名称对照表集合* @return 数值型阿拉伯整数数字*/if (in.indexOf("万") != -1) {// 万以上数字转换String left = in.substring(0, in.indexOf("万"));String right = in.substring(in.indexOf("万") + 1);if ((right.indexOf("万") == -1)) {return chToNum(left, num) * 10000 + chToNum(right, num);} else {throw new Exception();}} else {// 万以下数字转换Map<Character, Integer> units = new HashMap<>();units.put('十', 10);units.put('拾', 10);units.put('百', 100);units.put('佰', 100);units.put('千', 1000);units.put('仟', 1000);int out = 0;// 定义返回值变量int unit = 1;// 单位for (int i = in.length() - 1; i >= 0; i--) {if (num.containsKey(in.charAt(i))) {out += num.get(in.charAt(i)) * unit;} else {unit = units.get(in.charAt(i));}}return out;}}
}

java:中文汉语数字和阿拉伯数字互相转换,人民币大小写转换相关推荐

  1. c语言人民币大小写转换,人民币大小写转换函数.xls

    人民币大小写转换函数.xls Sheet3 Sheet1 IF(A1=0,"",IF(ABS(A1)<0.995,"",TEXT(INT(ROUND(AB ...

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

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

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

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

  4. 巧用Excel 轻松转换人民币大小写

          巧用Excel 轻松转换人民币大小写 2010-02-08 11:22 要将人民币小写金额转换成大写格式,用Excel提供的格式,将自定义格式类型中的"[dbnum2]G/通用格 ...

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

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

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

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

  7. 人民币大小写转换格式

    <?php //****人民币大小写转换格式**** function ChangeToRMB($Val) { $str=array(); $str[0]="零"; $str ...

  8. 超强技巧分享,如何将人民币大小写转换?

    当我们在制作财务表格的时候,需要将金额的大写跟小写进行转换,如果要一个一个手打出来的话,那就太浪费时间了,一两个数额还好,如果一整个表格的数额,那就不得了了,那要花费多少时间才能将小写金额转换成大写金 ...

  9. 中文大写数字转换为阿拉伯数字(java)

    1.引言 昨天面试了微软的暑期实习生,二面的时候面试官给出了这道题,起初拿到题目的时候感觉还挺简单的,想着直接用遍历加一个缓存应该就能搞定了,但是和面试官沟通了一会儿之后发现自己没考虑到的还有很多,最 ...

  10. Python 中文(大写)数字转阿拉伯数字

    中文转数字,小数的化考虑点字进一步封装即可. # constants for chinese_to_arabic CN_NUM = {'〇' : 0, '一' : 1, '二' : 2, '三' : ...

最新文章

  1. c语言的特点能够编制出复杂的功能程序,以下不是C语言的特点的是()
  2. Python下载文件的11种方式
  3. java开发常用jar包_Java开发中常用jar包整理及使用
  4. [redis设计与实现][7]基本数据结构——对象
  5. oracle存储返回sql查询,如何做才能使record类型和table类型存储查询语句返回的多条记录?...
  6. ArcGIS 的 http://localhost:8399/arcgis/rest/services 无法打开,显示404 的解决办法
  7. gitlab客户端下载配置
  8. 虚拟服务器无限网站个数,一个虚拟主机最多可以放几个网站
  9. 01-02 Linux常用命令-文件处理
  10. 学习指南_学习指南语文—成于素养,归于方法
  11. Java Number Tips
  12. matlab怎么编写数据处理程序,【悬赏--已结束】求编写一个基于Matlab的数据处理程序...
  13. 两个rpm文件包存在互相依赖关系时,需要同时安装,解决办法如下
  14. ds90ub934 i2c 配置_TI ds90ub954 芯片调试简单总结
  15. FLOW 3D二次开发
  16. 计算机硬盘使用寿命,一块机械硬盘的寿命能超过十年吗?
  17. DAX:RELATED 和 RELATEDTABLE
  18. C# Winform控件贴透明png图片遇到的问题
  19. 如何利用springboot快速搭建一个消息推送系统
  20. 腾讯47岁T13大佬被裁,厂龄15年依然被毕业?

热门文章

  1. 全国通用DNS服务器
  2. Error: java.lang.RuntimeException: Crunching Cruncher xxx.9.png failed,
  3. 我对onselect和onchange事件的误解
  4. 地球轨道计算方法,开普勒三大定律的证明,补充-解析几何之椭圆
  5. 语音控制c语言程序,基于52单片机的智能家居语音控制系统电路设计(含源程序+原理图)...
  6. lwj_C#_周总结1
  7. 美国大学计算机信息技术专业排名,新鲜出炉 2019年USNews美国大学信息技术管理专业排名榜单!...
  8. CHEMKIN III 学习笔记
  9. docker安装gitlab
  10. java 汽车类_汽车类 - java代码库 - 云代码