本人是从事互联网金融行业的,所以会接触到一些金融类的问题,常见的一种就是数字转汉字大小写的问题。所以抽空就写了一个小小的工具类,实现了数字转汉字、大数相加、相减、相乘的工具类,希望能帮助有需求的同行们。本篇就分享一下数字转化为汉字的思路吧。
数字转汉字的原理:
废话了这么多,可能云里雾里的,看看具体代码吧:
//num 表示数字,lower表示小写,upper表示大写 private static final String[] num_lower = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" }; private static final String[] num_upper = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; //unit 表示单位权值,lower表示小写,upper表示大写 private static final String[] unit_lower = { "", "十", "百", "千" }; private static final String[] unit_upper = { "", "拾", "佰", "仟"}; private static final String[] unit_common = {"","万", "亿","兆","京","垓","秭","穰","沟","涧","正","载"}; //允许的格式 private static final List<String> promissTypes = Arrays.asList("INTEGER","INT","LONG","DECIMAL","FLOAT","DOUBLE","STRING","BYTE","TYPE","SHORT"); /** * 数字转化为小写的汉字 * * @param num 将要转化的数字 * @return */ public static String toChineseLower(Object num){ return format(num, num_lower, unit_lower); } /** * 数字转化为大写的汉字 * * @param num 将要转化的数字 * @return */ public static String toChineseUpper(Object num){ return format(num, num_upper, unit_upper); } /** * 格式化数字 * * @param num 原数字 * @param numArray 数字大小写数组 * @param unit 单位权值 * @return */ private static String format(Object num,String[] numArray,String[] unit){ if(!promissTypes.contains(num.getClass().getSimpleName().toUpperCase())){ throw new RuntimeException("不支持的格式类型"); } //获取整数部分 String intnum = getInt(String.valueOf(num)); //获取小数部分 String decimal = getFraction(String.valueOf(num)); //格式化整数部分 String result = formatIntPart(intnum,numArray,unit); if(!"".equals(decimal)){//小数部分不为空 //格式化小数 result += "点"+formatFractionalPart(decimal, numArray); } return result; } /** * 格式化整数部分 * * @param num 整数部分 * @param numArray 数字大小写数组 * @return */ private static String formatIntPart(String num,String[] numArray,String[] unit){ //按4位分割成不同的组(不足四位的前面补0) Integer[] intnums = split2IntArray(num); boolean zero = false; StringBuffer sb = new StringBuffer(); for(int i=0;i<intnums.length;i++){ //格式化当前4位 String r = formatInt(intnums[i], numArray,unit); if("".equals(r)){// if((i+1)==intnums.length){ sb.append(numArray[0]);//结果中追加“零” }else{ zero=true; } }else{//当前4位格式化结果不为空(即不为0) if(zero || (i>0 && intnums[i]<1000)){//如果前4位为0,当前4位不为0 sb.append(numArray[0]);//结果中追加“零” } sb.append(r); sb.append(unit_common[intnums.length-1-i]);//在结果中添加权值 zero=false; } } return sb.toString(); } /** * 格式化小数部分 * * @param decimal 小数部分 * @param numArray 数字大小写数组 * @return */ private static String formatFractionalPart(String decimal,String[] numArray) { char[] val = String.valueOf(decimal).toCharArray(); int len = val.length; StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { int n = Integer.valueOf(val[i] + ""); sb.append(numArray[n]); } return sb.toString(); }
拆分整数和小数的方法在这里:
/** * 获取整数部分 * * @param num * @return */ private static String getInt(String num){ //检查格式 checkNum(num); char[] val = String.valueOf(num).toCharArray(); StringBuffer sb = new StringBuffer(); int t , s = 0; for (int i = 0; i < val.length; i++) { if(val[i]=='.') { break; } t = Integer.parseInt(val[i]+"",16); if(s+t==0){ continue; } sb.append(t); s+=t; } return (sb.length()==0? "0":sb.toString()); } /** * 获取小数部分 * * @param num * @return */ private static String getFraction(String num){ int i = num.lastIndexOf("."); if(num.indexOf(".") != i){ throw new RuntimeException("数字格式不正确,最多只能有一位小数点!"); } String fraction =""; if(i>=0){ fraction = getInt(new StringBuffer(num).reverse().toString()); if(fraction.equals("0")){ return ""; } } return new StringBuffer(fraction).reverse().toString(); } /** * 检查数字格式 * * @param num */ private static void checkNum(String num) { if(num.indexOf(".") != num.lastIndexOf(".")){ throw new RuntimeException("数字["+num+"]格式不正确!"); } if(num.indexOf("-") != num.lastIndexOf("-") || num.lastIndexOf("-")>0){ throw new RuntimeException("数字["+num+"]格式不正确!"); } if(num.indexOf("+") != num.lastIndexOf("+")){ throw new RuntimeException("数字["+num+"]格式不正确!"); } if(num.indexOf("+") != num.lastIndexOf("+")){ throw new RuntimeException("数字["+num+"]格式不正确!"); } if(num.replaceAll("[\\d|\\.|\\-|\\+]", "").length()>0){ throw new RuntimeException("数字["+num+"]格式不正确!"); } }
通过这种分而治之的思路,处理起来就简单多了。写个main函数调用一下:
public static void main(String[] args) { short s = 10; byte b=10; char c='A'; Object[] nums = {s, b, c, 0, 1001, 100100001L, 21., 205.23F, 205.23D, "01000010", "1000000100105.0123", ".142", "20.00", "1..2", true}; System.out.println("将任意数字转化为汉字(包括整数、小数以及各种类型的数字)"); System.out.println("--------------------------------------------"); for(Object num :nums){ try{ System.out.print("["+num.getClass().getSimpleName()+"]"+num); for(int i=0;i<25-String.valueOf(num+num.getClass().getSimpleName()).length();i+=4){ System.out.print("\t"); } //调用转化为小写和大写 System.out.print(" format:"+toChineseLower(num)); System.out.println("【"+toChineseUpper(num)+"】"); }catch(Exception e){ System.out.println(" 错误信息:"+e.getMessage()); } } }
看看结果吧:
从上述代码和运行结果中,我们可以看到该功能支持多种数据类型的转换、支持转化为一般汉字和财务专用大写汉字。还可以智能处理非正常逻辑的数字。比如“20”会转化为“二十”而非“二十零”;“1 0000 0001” 转换成“一亿零一”而非“一亿零万零一”。
这里只分享了一个转换汉字的功能,下篇将分享一下大数相乘、相加、相减的方法。支持小数和负数的运算,敬请期待。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍java实现阿拉伯数字转汉字数字,包括了java实现阿拉伯数字转汉字数字的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现阿拉伯数字转汉字数字的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
汉字拼音转换工具,可以用于汉字注音、排序、检索。 注:这个版本同时支持在 Node 和 Web 浏览器环境运行,Python 版请关注 mozillazg/python-pinyin 特性 根据词组智能匹配最正确的拼音。 支持多音字。 简单的繁体支持。 支持多种不同拼音风格。 安装 via npm: npm install pinyin 用法 开发者: var pinyin = require("
本文向大家介绍java金额数字转中文工具类详解,包括了java金额数字转中文工具类详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java金额数字转中文工具类的具体代码,供大家参考,具体内容如下 java金额数字转中文工具类ConvertNum.java 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍java处理字节的常用工具类,包括了java处理字节的常用工具类的使用技巧和注意事项,需要的朋友参考一下 处理字节的常用工具类方法,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍java实现汉字转unicode与汉字转16进制实例,包括了java实现汉字转unicode与汉字转16进制实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现汉字转unicode与汉字转16进制的实现方法。分享给大家供大家参考。具体实现方法如下: 一、汉字转unicode 二、汉字转16进制 希望本文所述对大家的Java程序设计有所帮助。
由来 数字工具针对数学运算做工具性封装 使用 加减乘除 NumberUtil.add 针对数字类型做加法 NumberUtil.sub 针对数字类型做减法 NumberUtil.mul 针对数字类型做乘法 NumberUtil.div 针对数字类型做除法,并提供重载方法用于规定除不尽的情况下保留小数位数和舍弃方式。 以上四种运算都会将double转为BigDecimal后计算,解决float和do