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

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

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

    Java快速開發(fā)平臺

    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 閱讀(24585) 評論(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 張醫(yī)僧
    恩 好!張醫(yī)僧用了說好~  回復  更多評論
      

    # 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的長度,通過角標獲取每個字符,遍歷字符串,用角標獲取單位,用值獲取大寫數字,將獲取每次循環(huán)獲得的結果存入一個字符串緩沖區(qū)
    * 此時有兩種情況出現:
    * 1、循環(huán)本次值也為0,就沒有必要存入;
    * 2、上次值為0,本次值不為0,就需要在本次前面加一個字符串“零”。
    * 解決辦法:定義變量moneybj,用于存入本次值,加以判斷確定存入什么值。
    * 當值為0時,無法解決金額達到萬或億或萬億時,單位不能存入緩沖區(qū),
    * 解決辦法:定義一個變量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 = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};
    //定義緩沖區(qū)
    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);
    }
    }
      回復  更多評論
      

    主站蜘蛛池模板: 美女无遮挡免费视频网站 | 国产免费看JIZZ视频| 8090在线观看免费观看| 中国亚洲女人69内射少妇| 久久er国产精品免费观看8| 中文字幕精品无码亚洲字| 免费国产黄网站在线观看动图| 日韩成人免费在线| 色多多免费视频观看区一区| 亚洲成a人片在线观看久| 国产97视频人人做人人爱免费| 中文字幕亚洲综合久久男男| 中文字幕视频在线免费观看| 免费在线看v网址| 亚洲色成人网站WWW永久四虎| 国产黄色片免费看| 情人伊人久久综合亚洲| 亚洲乱亚洲乱妇无码| 99视频在线精品免费| 亚洲日本国产乱码va在线观看| 特色特黄a毛片高清免费观看| 美女视频黄是免费的网址| 亚洲天堂2016| 麻豆高清免费国产一区| 亚洲国产激情一区二区三区| 国产黄在线播放免费观看| 亚洲视频免费一区| 日本高清免费中文字幕不卡| 中文字幕在线观看免费| 337p欧洲亚洲大胆艺术| 国产精品视频免费一区二区三区 | 18pao国产成视频永久免费| 亚洲色精品三区二区一区| 亚洲精品国产成人影院| 亚洲一区电影在线观看| 222www免费视频| 国产精品亚洲天堂| 亚洲日本一区二区| 免费观看日本污污ww网站一区| 中文成人久久久久影院免费观看| 亚洲欧洲日韩国产一区二区三区|