1、如何将阿拉伯数字金额转换成中文大写金额
import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by IntelliJ IDEA * 这是一个神奇的Class,阿拉伯数字金额转换成中文大写金额 * * @author zhz * @date 2019/10/19 17:03 */ public class NumberToChineseUtil { private static final Pattern AMOUNT_PATTERN = Pattern.compile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)$"); // 不考虑分隔符的正确性 private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray(); private static final String[] UNITS = {"元", "角", "分", "整"}; private static final String[] U1 = {"", "拾", "佰", "仟"}; private static final String[] U2 = {"", "万", "亿"}; /** * 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式. * @param amount 金额数字 * @return 中文大写 * @throws IllegalArgumentException */ public static String convert(String amount) throws IllegalArgumentException { // 去掉分隔符 amount = amount.replace(",", ""); // 验证金额正确性 if (amount.equals("0.00")) { throw new IllegalArgumentException("金额不能为零."); } Matcher matcher = AMOUNT_PATTERN.matcher(amount); if (! matcher.find()) { throw new IllegalArgumentException("输入金额有误."); } String integer = matcher.group(1); // 整数部分 String fraction = matcher.group(2); // 小数部分 String result = ""; if (! integer.equals("0")) { result += integer2rmb(integer) + UNITS[0]; // 整数部分 } if (fraction.equals("00")) { result += UNITS[3]; // 添加[整] } else if (fraction.startsWith("0") && integer.equals("0")) { result += fraction2rmb(fraction).substring(1); // 去掉分前面的[零] } else { result += fraction2rmb(fraction); // 小数部分 } return result; } // 将金额小数部分转换为中文大写 private static String fraction2rmb(String fraction) { char jiao = fraction.charAt(0); // 角 char fen = fraction.charAt(1); // 分 return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : "")) + (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : ""); } // 将金额整数部分转换为中文大写 private static String integer2rmb(String integer) { StringBuilder buffer = new StringBuilder(); // 从个位数开始转换 int i, j; for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) { char n = integer.charAt(i); if (n == '0') { // 当n是0且n的右边一位不是0时,插入[零] if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') { buffer.append(RMB_NUMS[0]); } // 插入[万]或者[亿] if (j % 4 == 0) { if (i > 0 && integer.charAt(i - 1) != '0' || i > 1 && integer.charAt(i - 2) != '0' || i > 2 && integer.charAt(i - 3) != '0') { buffer.append(U2[j / 4]); } } } else { if (j % 4 == 0) { buffer.append(U2[j / 4]); // 插入[万]或者[亿] } buffer.append(U1[j % 4]); // 插入[拾]、[佰]或[仟] buffer.append(RMB_NUMS[n - '0']); // 插入数字 } } return buffer.reverse().toString(); } /** * 对金额的格式调整到分 * @param money * @return */ public static String moneyFormat(String money){//23->23.00 StringBuffer sb=new StringBuffer(); if(money==null){ return "0.00"; } int index=money.indexOf("."); if(index==-1){ return money+".00"; }else{ String s0=money.substring(0,index);//整数部分 String s1=money.substring(index+1);//小数部分 if(s1.length()==1){//小数点后一位 s1=s1+"0"; }else if(s1.length()>2){//如果超过3位小数,截取2位就可以了 s1=s1.substring(0,2); } sb.append(s0); sb.append("."); sb.append(s1); } return sb.toString(); } /** * @param args */ public static void main(String[] args) { System.out.println(NumberToChineseUtil.moneyFormat("16")); System.out.println(NumberToChineseUtil.convert("2.00")); } }
结果如下:
2、阿拉伯数字转换成中文数字
/** * Created by IntelliJ IDEA * 这是一个神奇的Class,阿拉伯数字转换成中文数字 * * @author zhz * @date 2019/10/19 17:13 */ public class NumberConventer { /// <summary> /// 阿拉伯數字轉中文 /// </summary> /// <param name="intInput"></param> /// <returns></returns> public static String ToConvtZH(Integer intInput) { String sd = ToCH(intInput); String sd2 = sd; if (intInput== 10) { //sd2 = sd.insert(sd.lastIndexOf('十'), "一"); sd2 = "十"; } return sd2; } public static String ToCH(Integer intInput) { String si = intInput.toString(); String sd = ""; if (si.length() == 1) //個 { sd += GetCH(intInput); return sd; } else if (si.length() == 2)//十 { if (si.substring(0, 1) == "1") sd += "十"; else sd += (GetCH(intInput / 10) + "十"); sd += ToCH(intInput % 10); } else if (si.length() == 3)//百 { sd += (GetCH(intInput / 100) + "百"); if (String.valueOf(intInput % 100).length() < 2 && (intInput % 100) != 0) sd += "零"; sd += ToCH(intInput % 100); } else if (si.length() == 4)//千 { sd += (GetCH(intInput / 1000) + "千"); if (String.valueOf(intInput % 1000).length() < 3 && (intInput % 1000) != 0) sd += "零"; sd += ToCH(intInput % 1000); } else if (si.length() == 5)//萬 { sd += (GetCH(intInput / 10000) + "万"); if (String.valueOf(intInput % 10000).length() < 4 && (intInput % 10000) != 0) sd += "零"; sd += ToCH(intInput % 10000); } return sd; } private static String GetCH(int input) { String sd = ""; switch (input) { case 1: sd = "一"; break; case 2: sd = "二"; break; case 3: sd = "三"; break; case 4: sd = "四"; break; case 5: sd = "五"; break; case 6: sd = "六"; break; case 7: sd = "七"; break; case 8: sd = "八"; break; case 9: sd = "九"; break; default: break; } return sd; } /** * 支持到12位 * * @param numberStr 中文数字 * @return int 数字 */ public static int getIntegerByNumberStr(String numberStr) { // 返回结果 int sum = 0; // null或空串直接返回 if (numberStr == null || ("").equals(numberStr)) { return sum; } // 过亿的数字处理 if (numberStr.indexOf("亿") > 0) { String currentNumberStr = numberStr.substring(0, numberStr.indexOf("亿")); int currentNumber = testA(currentNumberStr); sum += currentNumber * Math.pow(10, 8); numberStr = numberStr.substring(numberStr.indexOf("亿") + 1); } // 过万的数字处理 if (numberStr.indexOf("万") > 0) { String currentNumberStr = numberStr.substring(0, numberStr.indexOf("万")); int currentNumber = testA(currentNumberStr); sum += currentNumber * Math.pow(10, 4); numberStr = numberStr.substring(numberStr.indexOf("万") + 1); } // 小于万的数字处理 if (!("").equals(numberStr)) { int currentNumber = testA(numberStr); sum += currentNumber; } return sum; } /** * 把亿、万分开每4位一个单元,解析并获取到数据 * @param testNumber * @return */ public static int testA(String testNumber) { // 返回结果 int sum = 0; // null或空串直接返回 if(testNumber == null || ("").equals(testNumber)){ return sum; } // 获取到千位数 if (testNumber.indexOf("千") > 0) { String currentNumberStr = testNumber.substring(0, testNumber.indexOf("千")); sum += testB(currentNumberStr) * Math.pow(10, 3); testNumber = testNumber.substring(testNumber.indexOf("千") + 1); } // 获取到百位数 if (testNumber.indexOf("百") > 0) { String currentNumberStr = testNumber.substring(0, testNumber.indexOf("百")); sum += testB(currentNumberStr) * Math.pow(10, 2); testNumber = testNumber.substring(testNumber.indexOf("百") + 1); } // 对于特殊情况处理 比如10-19是个数字,十五转化为一十五,然后再进行处理 if (testNumber.indexOf("十") == 0) { testNumber = "一" + testNumber; } // 获取到十位数 if (testNumber.indexOf("十") > 0) { String currentNumberStr = testNumber.substring(0, testNumber.indexOf("十")); sum += testB(currentNumberStr) * Math.pow(10, 1); testNumber = testNumber.substring(testNumber.indexOf("十") + 1); } // 获取到个位数 if(!("").equals(testNumber)){ sum += testB(testNumber.replaceAll("零","")); } return sum; } public static int testB(String replaceNumber) { switch (replaceNumber) { case "一": return 1; case "二": return 2; case "三": return 3; case "四": return 4; case "五": return 5; case "六": return 6; case "七": return 7; case "八": return 8; case "九": return 9; case "零": return 0; default: return 0; } } public static void main(String[] args) { for (int i=0;i<50;i++){ String _number = NumberConventer.ToConvtZH(i); int j = NumberConventer.getIntegerByNumberStr("一"); System.err.println(i+"===="+_number+"----->"+"一==="+j); } Integer aa = 10; String _number = NumberConventer.ToConvtZH(aa); System.out.println(_number); }
结果如下: