<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(24561) 評論(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);
    }
    }
      回復  更多評論
      

    主站蜘蛛池模板: 久久久免费精品re6| 中文字幕免费在线看电影大全| 亚洲免费福利视频| 亚洲成A人片在线观看WWW| 久久精品免费网站网| 亚洲尤码不卡AV麻豆| 中文永久免费观看网站| 亚洲最大激情中文字幕| 中文在线观看国语高清免费| 亚洲性久久久影院| 国产一级在线免费观看| 亚洲一级二级三级不卡| 久久国产色AV免费观看| 亚洲另类春色国产精品| 免费看大黄高清网站视频在线| 亚洲av永久无码精品网址| www国产亚洲精品久久久 | 亚洲一区二区三区免费视频| 国产免费AV片在线播放唯爱网| 亚洲一级毛片视频| 日韩免费a级在线观看| 一级做a爰片久久毛片免费陪| 亚洲综合国产一区二区三区| 亚洲精品免费视频| 亚洲综合国产成人丁香五月激情| 日韩毛片免费在线观看| 四虎影视在线看免费观看| 亚洲第一区香蕉_国产a| 无码人妻精品一二三区免费| 国产成人综合亚洲| 国产亚洲成av人片在线观看 | 99久久免费国产特黄| 亚洲成人免费网站| 国产免费人成在线视频| 97人妻精品全国免费视频 | 久久亚洲AV无码精品色午夜麻| 亚洲电影在线免费观看| 亚洲精品无码日韩国产不卡av| 国产成人亚洲综合无码| 亚洲黄色免费观看| 色网站在线免费观看|