[Java] java代码将金额转换成大写 →→→→→进入此内容的聊天室

来自 , 2020-03-29, 写在 Java, 查看 138 次.
URL http://www.code666.cn/view/d9eb09a4
  1. /**
  2.  * 金额大写
  3.  * @author 0x0001
  4.  *
  5.  */
  6. public class Je {
  7.         private static String[] num = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
  8.         // 10进制单位
  9.         private static String[] dw = {"","拾","佰","仟"};
  10.         // 数值进度单位参考 http://www.douban.com/group/topic/5404723/   http://zhidao.baidu.com/question/51925487.html
  11.         // 1000进制单位
  12.         private static String[] dw2 = {"","萬","億","兆","京","垓","杼","穰","溝","澗","正","載","極","恆河沙","阿僧祇","那由他","不可思議","无量","大数"};
  13.         private static String[] dw1 = {"角","分"};
  14.         public static void main(String[] args) {
  15.                 String test = "999.91";
  16.                 System.out.println(parse(test));
  17.         }
  18.        
  19.         private static String parse(String str) {
  20.                 str = str.replaceAll("^(0{1,})(.*)", "0$2").replaceAll("(.*)(0*)$", "$1");
  21.                 // 判断是否为合格数字
  22.                 if(str.matches("^\\d+(\\.\\d+)?\\d*$")) {
  23.                         String integer = "";
  24.                         String decimal = "";
  25.                         // 拆分成整数和小数部分
  26.                         int pos = str.indexOf(".");
  27.                         if(pos >=0 ) {
  28.                                 integer = str.substring(0,pos);
  29.                                 decimal = str.substring(pos+1);
  30.                         } else {
  31.                                 integer = str;
  32.                         }
  33.                         // 解析整数字符串
  34.                         String intStr =  parseIntger(integer);
  35.                         // 解析小数字符串
  36.                         String decimalStr = parseDecimal(decimal,!intStr.isEmpty());
  37.                         if(!intStr.isEmpty()) {
  38.                                 intStr += "元";
  39.                                 if(integer.endsWith("0") && !decimal.isEmpty()){
  40.                                         intStr+="零";
  41.                                 }
  42.                         } else if(decimalStr.isEmpty()) {
  43.                                 intStr = "零元";
  44.                         }
  45.                         return intStr + (decimalStr.isEmpty()?"整":decimalStr);
  46.                 }
  47.                 throw new IllegalArgumentException(str);
  48.         }
  49.        
  50.         /**
  51.          * 解析整数 规则为:
  52.          *      将字符串从后往前分割成四个字符一组的字符串二维数组(对应1000进制单位)
  53.          *  分别解析每个数组为10进制单位中对应的字符串
  54.          *  合并到一起则为整个字符串
  55.          * @param str
  56.          * @return
  57.          */
  58.         private static String parseIntger(String str) {
  59.                 if(null == str || str.isEmpty()) {
  60.                         return "";
  61.                 }
  62.                 // 分割字符串为四个字符一组的字符串二维数组
  63.                 char[][] nums = spit(str.toCharArray());
  64.                 StringBuilder s = new StringBuilder();
  65.                 // 上一组数字中最后一个字符是否为0 (方便拼接 “零” )
  66.                 boolean lastZero = false;
  67.                 for(int j=0;j<nums.length;j++) {
  68.                         char[] chs = nums[j];
  69.                         // 整组数字中是不是全为 0 (方便拼接 千进制单位 )
  70.                         boolean allZero = true;
  71.                         // 以下循环将四位字符解析为 10进制单位中的数
  72.                         for(int i=0,len=chs.length;i<len;i++) {
  73.                                 int value = chs[i] - '0';
  74.                                 // 当前数字大于0或者下一个数字不是0
  75.                                 if(value > 0 || (i < (len-1) && (chs[i+1] - '0') > 0)) {
  76.                                         if(lastZero) {
  77.                                                 // 如果上一次解析的时候最有一个数字为0,并且当前数字不为0的情况则在前面先拼接 “零”
  78.                                                 if(value > 0) {
  79.                                                         s.append(num[0]);
  80.                                                 }
  81.                                                 lastZero = false;
  82.                                         }
  83.                                         s.append(num[value]);
  84.                                         allZero = false;
  85.                                 }
  86.                                 if(value > 0) { // 不是零的情况拼接单位
  87.                                         s.append(dw[chs.length - i -1]);
  88.                                 }
  89.                         }
  90.                         lastZero = chs[chs.length-1] == '0';
  91.                         if(!allZero) { // 如果当前解析的四个字符不是全为0 则拼接千进制单位
  92.                                 s.append(dw2[nums.length - j - 1]);
  93.                         }
  94.                 }
  95.                
  96.                 return s.toString();
  97.         }
  98.        
  99.         /**
  100.          * 拆分字符数组为四个字符一组的二位数组 (从后往前截取 如:
  101.          *      10001  会截取成 arr[0] = {'1'}; arr[1] = {'0','0','0','1'};
  102.          * )
  103.          * @param chs
  104.          * @return
  105.          */
  106.         private static char[][] spit(char[] chs) {
  107.                 int tmpSize = chs.length / 4;
  108.                 int size = chs.length %  4 == 0?tmpSize:tmpSize+1;
  109.                 char[][] nums = new char[size][];
  110.                 if(1 == size) {
  111.                         nums[0] = chs;
  112.                 } else {
  113.                         for(int i=chs.length;i>0;i-=4) {
  114.                                 if(i < 4) {
  115.                                         nums[--size] = Arrays.copyOfRange(chs, 0, i);
  116.                                 } else {
  117.                                         nums[--size] = Arrays.copyOfRange(chs, i-4, i);
  118.                                 }
  119.                         }
  120.                 }
  121.                 return nums;
  122.         }
  123.        
  124.         /**
  125.          * 解析小数单位 只精确到提供的单位 @see {@link Je#dw1} 多余数字直接忽略
  126.          * @param str
  127.          * @param existsInt 是否存在整数 (如果不存在整数,则不拼 零)
  128.          * @return
  129.          */
  130.         private static String parseDecimal(String str,boolean existsInt) {
  131.                 if( null == str || str.isEmpty()) {
  132.                         return "";
  133.                 }
  134.                 if(str.length() > dw1.length) {
  135.                         str = str.substring(0,dw1.length);
  136.                 }
  137.                 char[] chs = str.toCharArray();
  138.                 StringBuilder s = new StringBuilder();
  139.                
  140.                 for(int i=0,len=chs.length;i<len;i++) {
  141.                         int value = chs[i] - '0';
  142.                         if(value != 0 || (i < (len-1) && (chs[i+1] - '0') > 0)) {
  143.                                 if(existsInt || value > 0) {
  144.                                         s.append(num[value]);
  145.                                 }
  146.                         }
  147.                         if(value > 0) {
  148.                                 s.append(dw1[i]);
  149.                         }
  150.                 }
  151.                 return s.toString();
  152.         }
  153. }
  154. //java/1328

回复 "java代码将金额转换成大写"

这儿你可以回复上面这条便签

captcha