Java快速開發平臺

          www.fastunit.com

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            23 Posts :: 0 Stories :: 273 Comments :: 0 Trackbacks

          處理能力:

          整數部分:9999999999999999(16位長,仟萬億)
          小數部分:3位,多于3位舍去(不做四舍五入)

          運行結果:
          1.23 壹元貳角叁分
          1234567890123456.123 壹仟貳佰叁拾肆萬伍仟陸佰柒拾捌億玖仟零壹拾貳萬叁仟肆佰伍拾陸元壹角貳分叁厘
          0.0798 柒分玖厘
          10,001,000.09 壹仟萬零壹仟元玖分
          01.107700 壹元壹角柒厘

          public class MoneyUtil {

            
          /** 大寫數字 */
            
          private static final String[] NUMBERS = { """""""""""""",
                
          """""" };
            
          /** 整數部分的單位 */
            
          private static final String[] IUNIT = { """""""""""""",
                
          """""""""""""""""" };
            
          /** 小數部分的單位 */
            
          private static final String[] DUNIT = { """""" };

            
          /**
             * 得到大寫金額。
             
          */
            
          public static String toChinese(String str) {
              str 
          = str.replaceAll(",""");// 去掉","
              String integerStr;// 整數部分數字
              String decimalStr;// 小數部分數字

              
          // 初始化:分離整數部分和小數部分
              if (str.indexOf("."> 0) {
                integerStr 
          = str.substring(0, str.indexOf("."));
                decimalStr 
          = str.substring(str.indexOf("."+ 1);
              } 
          else if (str.indexOf("."== 0) {
                integerStr 
          = "";
                decimalStr 
          = str.substring(1);
              } 
          else {
                integerStr 
          = str;
                decimalStr 
          = "";
              }
              
          // integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去)
              if (!integerStr.equals("")) {
                integerStr 
          = Long.toString(Long.parseLong(integerStr));
                
          if (integerStr.equals("0")) {
                  integerStr 
          = "";
                }
              }
              
          // overflow超出處理能力,直接返回
              if (integerStr.length() > IUNIT.length) {
                System.out.println(str 
          + ":超出處理能力");
                
          return str;
              }

              
          int[] integers = toArray(integerStr);// 整數部分數字
              boolean isMust5 = isMust5(integerStr);// 設置萬單位
              int[] decimals = toArray(decimalStr);// 小數部分數字
              return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
            }

            
          /**
             * 整數部分和小數部分轉換為數組,從高位至低位
             
          */
            
          private static int[] toArray(String number) {
              
          int[] array = new int[number.length()];
              
          for (int i = 0; i < number.length(); i++) {
                array[i] 
          = Integer.parseInt(number.substring(i, i + 1));
              }
              
          return array;
            }

            
          /**
             * 得到中文金額的整數部分。
             
          */
            
          private static String getChineseInteger(int[] integers, boolean isMust5) {
              StringBuffer chineseInteger 
          = new StringBuffer("");
              
          int length = integers.length;
              
          for (int i = 0; i < length; i++) {
                
          // 0出現在關鍵位置:1234(萬)5678(億)9012(萬)3456(元)
                
          // 特殊情況:10(拾元、壹拾元、壹拾萬元、拾萬元)
                String key = "";
                
          if (integers[i] == 0) {
                  
          if ((length - i) == 13)// 萬(億)(必填)
                    key = IUNIT[4];
                  
          else if ((length - i) == 9)// 億(必填)
                    key = IUNIT[8];
                  
          else if ((length - i) == 5 && isMust5)// 萬(不必填)
                    key = IUNIT[4];
                  
          else if ((length - i) == 1)// 元(必填)
                    key = IUNIT[0];
                  
          // 0遇非0時補零,不包含最后一位
                  if ((length - i) > 1 && integers[i + 1!= 0)
                    key 
          += NUMBERS[0];
                }
                chineseInteger.append(integers[i] 
          == 0 ? key
                    : (NUMBERS[integers[i]] 
          + IUNIT[length - i - 1]));
              }
              
          return chineseInteger.toString();
            }

            
          /**
             * 得到中文金額的小數部分。
             
          */
            
          private static String getChineseDecimal(int[] decimals) {
              StringBuffer chineseDecimal 
          = new StringBuffer("");
              
          for (int i = 0; i < decimals.length; i++) {
                
          // 舍去3位小數之后的
                if (i == 3)
                  
          break;
                chineseDecimal.append(decimals[i] 
          == 0 ? ""
                    : (NUMBERS[decimals[i]] 
          + DUNIT[i]));
              }
              
          return chineseDecimal.toString();
            }

            
          /**
             * 判斷第5位數字的單位"萬"是否應加。
             
          */
            
          private static boolean isMust5(String integerStr) {
              
          int length = integerStr.length();
              
          if (length > 4) {
                String subInteger 
          = "";
                
          if (length > 8) {
                  
          // 取得從低位數,第5到第8位的字串
                  subInteger = integerStr.substring(length - 8, length - 4);
                } 
          else {
                  subInteger 
          = integerStr.substring(0, length - 4);
                }
                
          return Integer.parseInt(subInteger) > 0;
              } 
          else {
                
          return false;
              }
            }

            
          public static void main(String[] args) {
              String number 
          = "1.23";
              System.out.println(number 
          + " " + MoneyUtil.toChinese(number));
              number 
          = "1234567890123456.123";
              System.out.println(number 
          + " " + MoneyUtil.toChinese(number));
              number 
          = "0.0798";
              System.out.println(number 
          + " " + MoneyUtil.toChinese(number));
              number 
          = "10,001,000.09";
              System.out.println(number 
          + " " + MoneyUtil.toChinese(number));
              number 
          = "01.107700";
              System.out.println(number 
          + " " + MoneyUtil.toChinese(number));
            }

          }
          posted on 2008-03-25 17:23 FastUnit 閱讀(24576) 評論(15)  編輯  收藏 所屬分類: Java

          Feedback

          # re: 金額數字轉中文大寫 2008-03-25 18:03 Find it, try it, experience it
          First, it's really a hard job. Second, too many if/else, String.indexOf and String.subString make it hard to read, it would be good if you add enough unit test for it.  回復  更多評論
            

          # re: 金額數字轉中文大寫[未登錄] 2008-04-22 11:14 阿錚
          很好的東東,謝謝了

          請問有沒有日期轉大寫的工具類  回復  更多評論
            

          # re: 金額數字轉中文大寫 2008-04-23 10:48 taonlyt
          超強  回復  更多評論
            

          # re: 金額數字轉中文大寫 2008-04-23 10:57 taonlyt
          謝謝,我借鑒了。  回復  更多評論
            

          # re: 金額數字轉中文大寫 2008-10-14 20:36 235
          謝謝~  回復  更多評論
            

          # re: 金額數字轉中文大寫 2009-01-01 01:28 事實上
          這個寫的太復雜了
            回復  更多評論
            

          # re: 金額數字轉中文大寫[未登錄] 2009-01-08 17:39 stone
          謝謝!  回復  更多評論
            

          # re: 金額數字轉中文大寫 2009-03-05 17:07 張醫僧
          恩 好!張醫僧用了說好~  回復  更多評論
            

          # re: 金額數字轉中文大寫 2010-09-03 10:04 笨牛
          10001000.09 壹仟萬零壹仟元玖分
          這個有問題 應該為 壹仟萬零壹仟元零玖分
            回復  更多評論
            

          # re: 金額數字轉中文大寫[未登錄] 2011-06-26 08:08 小李
          147528903000  回復  更多評論
            

          # re: 金額數字轉中文大寫[未登錄] 2011-06-26 08:09 小李
          4155405302708.16大寫怎么寫?  回復  更多評論
            

          # re: 金額數字轉中文大寫[未登錄] 2011-06-26 08:11 小李
          1167248680536大寫怎么寫?  回復  更多評論
            

          # 13340.60[未登錄] 2013-03-18 07:48 1
          13340.60  回復  更多評論
            

          # re: 金額數字轉中文大寫 2013-08-23 16:45 阿里媽媽
          566400  回復  更多評論
            

          # re: 金額數字轉中文大寫[未登錄] 2013-11-20 23:59 titan
          /*
          * 需求:自動轉換人民幣大寫金額的程序
          *
          * 思路:
          * 獲取一個double my
          * 格式化double,格式:##0.00,轉換成去掉小數點的字符串formatDouble
          * 定義大寫數字數組的String[] money和單位數組String[] unit
          * 判斷字符串formatDouble的長度,通過角標獲取每個字符,遍歷字符串,用角標獲取單位,用值獲取大寫數字,將獲取每次循環獲得的結果存入一個字符串緩沖區
          * 此時有兩種情況出現:
          * 1、循環本次值也為0,就沒有必要存入;
          * 2、上次值為0,本次值不為0,就需要在本次前面加一個字符串“零”。
          * 解決辦法:定義變量moneybj,用于存入本次值,加以判斷確定存入什么值。
          * 當值為0時,無法解決金額達到萬或億或萬億時,單位不能存入緩沖區,
          * 解決辦法:定義一個變量unitbj,用于判斷
          * 1、當0值“萬”存入后,鎖死標記,直到有非0值存入時才打開
          * 2、億在整個存入過程中只可能出現一次,所以不用判斷,只要有“億”,直接存入并鎖死標記。
          * 3、
          *
          * 注意:
          * 本方法最大到千億;
          * 調用方法前,注意判斷金額值為0和負數。為零直接打印輸出零,為負數乘以-1后調用方法,在結果前面加”負“。
          */

          package test;

          import java.text.DecimalFormat;

          class Test
          {
          public static void main(String[] args)
          {
          double my = 10001000.9;

          if (formatdouble(my).equals("000") || (formatdouble(my).equals("-000")) )
          sop("人民幣零元整");
          else
          {
          if (my<-0.0)
          sop("人民幣負"+strStandard(strUppercase(my*-1.0)));
          else
          sop("人民幣"+strStandard(strUppercase(my)));
          }
          }
          //按人民幣大寫的格式格式化
          private static String strStandard(String s)
          {
          if (s.indexOf("分")==-1)
          s= s+"整" ;
          return s;

          }
          //定義大寫數組和單位數組,并遍歷格式化后的字符串,退回一個字符串
          private static String strUppercase(double my)
          {
          //定義大寫unit
          String[] unit = {"仟","佰","拾","萬","仟","佰","拾","億","仟","佰","拾","萬","仟","佰","拾","元","角","分"};
          //定義大寫單位money
          String[] money = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};
          //定義緩沖區
          StringBuilder strBuilder = new StringBuilder();
          //格式化
          String strFormat = formatdouble(my);
          //遍歷
          int strlength=strFormat.length();
          int moneybj = 1;//用于標記上次money值是否為零
          int unitbj=1;//用于標記在money值等于0的情況下“萬”是否存入過
          for(int i=0;i<strlength ; i++)
          {
          int value = Integer.parseInt(String.valueOf(strFormat.charAt(i)));

          if (moneybj!=0 & value!=0 )//情況一:上次和本次值不為0,直接存入
          {
          strBuilder.append(money[value]).append(unit[unit.length-strlength+i]);
          moneybj=value;
          unitbj=1;
          }
          if(moneybj==0 & value!=0)//情況二:上次值為0,本次值不為0,加“零“存入
          {
          strBuilder.append("零").append(money[value]).append(unit[unit.length-strlength+i]);
          moneybj=value;
          unitbj=1;
          }
          if(moneybj==0 & value==0)//情況三:上次和本次值為0,不存入
          {
          if (unitbj==1 && unit[unit.length-strlength+i].equals("萬") )
          {
          strBuilder.append("萬");
          unitbj=0;
          }
          if (unit[unit.length-strlength+i].equals("元") )//解決如果元位上是0的問題
          {
          strBuilder.append("元");
          }
          if (unit[unit.length-strlength+i].equals("億") )
          {
          strBuilder.append("億");
          unitbj=0;
          }

          moneybj=value;
          }
          if(moneybj!=0 & value==0)//情況三:上次值不為0,本次值為0,不存入
          {
          if (unitbj==1 && unit[unit.length-strlength+i].equals("萬") )
          {
          strBuilder.append("萬");
          unitbj=0;
          }
          if (unit[unit.length-strlength+i].equals("元") )//解決如果元位上是0的問題
          {
          strBuilder.append("元");
          }
          if (unit[unit.length-strlength+i].equals("億") )
          {
          strBuilder.append("億");
          unitbj=0;
          }
          moneybj=value;
          }
          }
          //在這種情況下前面會有“零”或 ”元“的存入,如 0.1 ,此時需要去掉“零”
          if (strBuilder.indexOf("零")==0)
          strBuilder.replace(0, 1, "");
          if (strBuilder.indexOf("元")==0)
          strBuilder.replace(0, 1, "");

          return strBuilder.toString();

          }

          //格式化字符串并退回一個字符串;
          private static String formatdouble(double my)
          {
          DecimalFormat format = new DecimalFormat("##0.00");
          //刪除小數點
          String str = format.format(my);
          return str.replace(".","");
          }
          //打印輸出
          private static void sop(Object obj)
          {
          System.out.println(obj);
          }
          }
            回復  更多評論
            

          主站蜘蛛池模板: 宁武县| 双峰县| 北宁市| 咸丰县| 锦屏县| 香河县| 林芝县| 东辽县| 云南省| 沾化县| 陵川县| 武邑县| 金平| 桃园县| 磐安县| 连云港市| 瑞金市| 江都市| 平阴县| 双城市| 裕民县| 和静县| 板桥市| 涞水县| 禄丰县| 新化县| 涞源县| 蕲春县| 同心县| 仁寿县| 鹿邑县| 太湖县| 和静县| 辽中县| 甘德县| 集安市| 婺源县| 微山县| 中方县| 绥宁县| 屯昌县|