阿拉伯数字金钱转中文大写

7 篇文章 0 订阅
  1.  本人是刚入行不久的菜鸟,由于工作可能会用到这个功能于是借鉴了前辈EXTjs前端的这个转大小写功能,用java 仿照写了一个,加上了负数处理功能(修改了-0.9...)bug的问题。
  2. Long.parseLong(integerNum, 10) > 0)
  3. 这个决定了处理数据的范围大小。 如果数据库里面的数据是BigDecimal类型,为了更精确那么以下的数据处理方式就需要改一改。   String n = integerNum.substring(i,i+1);   
    这段代码在EXTJS里面是String n = integerNum.substr(i,1)没问题,但是java中处理不同,最后排错才循环取得时候java中是往后依次取需要循环加1;不知道哪位大神前辈能指教指教EXTJS中substr这里与java的区别;当时考虑到需要开具负数发票的情况于是想了个简单的方法拼上负数的符号来解决这个问题。 这个方法的核心部分在整数部分截取后处理的算法(说实话没有透彻理解...),网上也看了其他前辈写的代码比这个多一倍的代码,但是好像有BUG ,,由于测的简单我这个不知道有没有BUG 希望哪位前辈能指点指点,万分感谢。
  4.     有一个网上前辈写的关于中国银行金钱的汉化处理规则,感觉很不错,可以搜索这句话:关于金钱中文大写表示规则
  5.    关于中间去连续零的方法我发现网上这位前辈写的比较好这是他的博客链接地址:http://blog.chinaunix.net/uid-615168-id-155559.html

  6. package practise;
  7. /**
  8.  * 阿拉伯数字金钱转中文大写
  9.  *
  10.  * @author zt
  11.  * @Date 2015年9月24日
  12.  */
  13. package practise;
  14. /**
  15.  * 阿拉伯数字金钱转中文大写
  16.  *
  17.  * @author zt
  18.  * @Date 2015年9月24日
  19.  */
  20. public class ChangeMoneyToChinese {
  21.     private static String[] cCharcters = new String[] { "零", "壹", "贰", "叁",
  22.         "肆", "伍", "陆", "柒", "捌", "玖" };/* 数字对应的汉字大写 */
  23.     private static String[] cnDws = new String[] { "", "拾", "佰", "仟" };/* 基本单位 */
  24.     private static String[] cnDdws = new String[] { "", "万", "亿", "兆" };/* 大单位扩展 */
  25.     private static String[] cnDecs = new String[] { "角", "分", "毫", "厘" };
  26.     private static String cnInteger = "整";/* 整型金额处理后跟的字符 */
  27.     private static String cnLast = "元";/* 数据处理后面 */
  28.     private static Double maxNum = 999999999999999.9999;/* 定义一个最大处理数 */
  29.     private static String bz = "负";
  30.     private static String integerNum;/* 金额整数部分 */
  31.     private static String decimalNum;/* 金额小数部分 */
  32.     private static String[] parts = new String[2];/* 金额字符串分割部分 */
  33.     private static String chineseStr = "";/* 接收转换后的中文大写字符串 */
  34.     private static char str;
  35.     public static String changeToChinese(String money) {
  36.     str = money.charAt(0);
  37.     if (str == '-') {
  38.         money = money.substring(1, money.length());/* 负数处理 */
  39.     }
  40.     /* 有三种其他情况:1,money="" 2.money=0 3,超出最大处理数据 */
  41.     /* 将获取的字符串数值数据转换为double型便于与数值进行比较 */
  42.     Double moneys = Double.parseDouble(money);
  43.     if (money == "") {
  44.         chineseStr = "";
  45.         return chineseStr;
  46.     } else if (moneys > maxNum) {
  47.         System.out.println("超出最大处理数,无法转换...");
  48.         chineseStr = "";
  49.         return chineseStr;
  50.     } else if (moneys == 0) {
  51.         chineseStr = cCharcters[0] + cnLast + cnInteger;
  52.         return chineseStr;
  53.     } else
  54.     /* 数据正常情况的处理,首先对数据进行整型部分和小数部分安要求进行截取处理 */
  55.     if (money.indexOf(".") == -1) {/* 字符串没有小数点的情况,整型 */
  56.         integerNum = money;/* 赋值整型 */
  57.         decimalNum = "";/* 无小数部分 */
  58.     } else {/* 有小数的情况 */
  59.         parts = money.split("\\.");/* 注意java中分割符号的格式问题\\加分割符号 */
  60.         integerNum = parts[0];
  61.         decimalNum = parts[1];
  62.         if (decimalNum.length() > 4) {/* java中截取字符串需要对位数进行判断操作否则容易报数组下标越界问题 */
  63.         decimalNum = parts[1].substring(0, 4);/* 只保留4位小数 */
  64.         } else {
  65.         decimalNum = parts[1];
  66.         }
  67.     }
  68.     /*--------------------------*/
  69.     /* 对整型部分处理的方法 */
  70.     integerNum(integerNum, str);
  71.     /* 对小数部分的处理方法 */
  72.     decimalNum(decimalNum);
  73.     /* 最后再对转换后的字符串进行判断 */
  74.     /*
  75.      * if(str=='-'){ chineseStr=bz+chineseStr; }
  76.      */
  77.     lastStr(chineseStr, str);/*调用最终处理方法*/
  78.     return chineseStr;
  79.     }
  80.     /* 对数据整型部分处理的方法 */
  81.     public static String integerNum(String integerNum, char str) {
  82.     if (Long.parseLong(integerNum, 10) > 0
  83.         || Long.parseLong(integerNum, 10) == 0) {// 获取整型部分转换,按10进制形式进行转换
  84.         int zeroCount = 0;
  85.         int intLen = integerNum.length();
  86.         for (int i = 0; i < intLen; i++) {
  87.         String n = integerNum.substring(i, i + 1);
  88.         int p = intLen - i - 1;
  89.         int q = p / 4;
  90.         int m = p % 4;
  91.         if (n == "0") {
  92.             zeroCount++;
  93.         } else {
  94.             if (zeroCount > 0) {
  95.             chineseStr += cCharcters[0];
  96.             }
  97.             zeroCount = 0; // 归零
  98.             chineseStr += cCharcters[Integer.parseInt(n)] + cnDws[m];
  99.         }
  100.         if (m == 0 && zeroCount < 4) {
  101.             chineseStr += cnDdws[q];
  102.         }
  103.         }
  104.         chineseStr += cnLast;
  105.         // 整型部分处理完毕
  106.     }
  107.     return chineseStr;
  108.     }
  109.     /* 对小数部分的处理方法 */
  110.     public static String decimalNum(String decimalNum) {
  111.     if (decimalNum != "") {// 小数部分
  112.         int decLen = decimalNum.length();
  113.         for (int i = 0; i < decLen; i++) {
  114.         String n = decimalNum.substring(i, i + 1);
  115.         /*注意循环每次截取的时候需要往后一位进行截取, 向右边移动一位*/                                                                              
  116.         if (n != "0") {
  117.             chineseStr += cCharcters[Integer.parseInt(n)] + cnDecs[i];
  118.         }
  119.         }
  120.     }
  121.     return chineseStr;
  122.     }
  123.     /* 最后再对转换后的字符串进行判断处理 */
        public static String lastStr(String strr, char str) {

        if (chineseStr == "") {/*0数据判断*/
            chineseStr += cCharcters[0] + cnLast + cnInteger;
        } else if (decimalNum == "") {/*整型判断*/
            chineseStr += cnInteger;
        }
        
        if (str == '-') {/*负数最后的处理*/
            chineseStr = bz + chineseStr;
        }
        return chineseStr;
        }
  124.     public static void main(String[] args) {
  125.     System.out.println(ChangeMoneyToChinese.changeToChinese("999999999999999.9999"));
  126.     System.out.println(ChangeMoneyToChinese.changeToChinese("-0.995"));
  127.     }
  128. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值