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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    人民幣大寫轉換

    問題:????商業領域,開發票,支票等金錢相關項目通常要求轉換成大寫,諸如“壹拾圓陸角玖分”.編程過程中,一般的錢幣都是double型.

    當前看到的方法:之所以寫這個方法,因為看到的方法設計的不是很好,通常的做法就是逐個字符處理,通過冗長的switch...case結構判斷,來決定當前是否應該輸出某某漢字,總體來說,完成這件任務是簡單的,但是代碼和設計質量卻不令人滿意.


    設計方法如下:
    需要注意的問題:
    ????1.各個阿拉伯數字可以通過一個數組'壹','貳','叁'....表示.
    ????2.對于大于10000和大于100000000的數字,可能出現'萬','億'字樣
    ????3.對于中間連續為0的數字,正確出現'零'的字樣,但是有幾種不同的情況需要處理
    ????4.對于某個段的數字全零的情況,例如,整個萬段都是0的情況-100000101,中間的0如何出現
    ????5.角分的處理,如果不存在角分的話,應該出現'圓整'的字樣
    ????6.整數部分不存在的情況,即只有角分,應該沒有'圓'的字樣
    設計框架:
    ????1.把數字轉化成字符串處理,使用Java的時候,把一個double類型轉化成一個字符串類型很簡單,
    ????調用????String.valueOf(double_var)即可得到,但是有一個問題,當你的數字大于10個位的時候,
    ????也就是達億的時候,他會轉換成科學計數法的字串,解決方法就是把他轉化成整形long.

    ????2.把數字分割成整數部分和小數部分分別處理,根據上面的方法,我們索性把double乘上100,
    ????取后兩位為小數部分,前面的為整數部分,得到
    ????long l = (long)(d*100);
    ????String strVal = String.valueOf(l);
    ????String head = strVal.substring(0,strVal.length()-2);???????? //整數部分
    ????String end = strVal.substring(strVal.length()-2);????????????? //小數部分
    ????
    ????3.我們應該把錢數分成段,每四個一段,實際上得到的是一個二維數組,如下:
    ????????????仟????????佰????????拾???? ????'?'
    ????' '????? $4????????$3????????$2?????????$1
    ????萬???? $8??? ????$7?? ????$6????? ????$5
    ????億???? $12? ????$11 ????$10??? ????$9
    ????
    ????其中$i表示這個數字的第i個位置的數字,我們并不實際設定二維數組,我們得到的是數字的位置,
    ????要處理的該產生什么樣的表示法,很簡單這種處理方式往往就是:設pos表示數字位置,pos/4 在那一個段
    ????萬以下段,萬段,億段.pos%4表示某一個段的段內位置,仟,佰,拾,由于疊加的緣故,即會有千萬,百萬,千億等
    ????出現,因此這種設計是成立的.這里面隱含了一個問題就是,我們當前的處理的最大數字達千億位,
    ????更大的數字用這種結構是不妥的,因為可能會有萬億,這時候推薦的想法是把這些設計成單維的數組結構,
    ????從而取得疊加的表示.
    ????4.循環處理各個位的過程中,我們可以預想到,零的問題是最難解決的.
    ????因為我們多個連續的零你只能出現一個表示,更有甚者,當某段全為0時,'零'還不能出現.
    ????因此這些問題綜合考慮得到以下代碼.


    代碼:(JAVA描述)

    public ? static ?String?changeToBig( double ?value){
    ????????
    char []?hunit = { ' ' , ' ' , ' ' };?????????????????????????????????? // 段內位置表示
    ???????? char []?vunit = { ' ' , ' ' };??????????????????????????????????????? // 段名表示
    ???????? char []?digit = { ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' };?? // 數字表示
    ???????? long ?midVal? = ?( long )(value * 100 );??????????????????????????????? // 轉化成整形
    ????????String?valStr = String.valueOf(midVal);?????????????????????????? // 轉化成字符串
    ????????String?head = valStr.substring( 0 ,valStr.length() - 2 );????????????? // 取整數部分
    ????????String?rail = valStr.substring(valStr.length() - 2 );??????????????? // 取小數部分

    ????????String?prefix
    = "" ;?????????????????????????????????????????????? // 整數部分轉化的結果
    ????????String?suffix = "" ;?????????????????????????????????????????????? // 小數部分轉化的結果
    ????????
    // 處理小數點后面的數
    ???????? if (rail.equals( " 00 " )){????????????????????????????????????????? // 如果小數部分為0
    ??????????suffix = " " ;
    ????????}?
    else {
    ??????????suffix
    = digit[rail.charAt( 0 ) - ' 0 ' ] + " " + digit[rail.charAt( 1 ) - ' 0 ' ] + " " ;? // 否則把角分轉化出來
    ????????}
    ????????
    // 處理小數點前面的數
    ???????? char []?chDig = head.toCharArray();????????????????? // 把整數部分轉化成字符數組
    ???????? char ?zero = ' 0 ' ;??????????????????????????????????? // 標志'0'表示出現過0
    ???????? byte ?zeroSerNum? = ? 0 ;????????????????????????????? // 連續出現0的次數
    ???????? for ( int ?i = 0 ;i < chDig.length;i ++ ){????????????????? // 循環處理每個數字
    ?????????? int ?idx = (chDig.length - i - 1 ) % 4 ;?????????????????? // 取段內位置
    ?????????? int ?vidx = (chDig.length - i - 1 ) / 4 ;????????????????? // 取段位置
    ?????????? if (chDig[i] == ' 0 ' ){????????????????????????????? // 如果當前字符是0
    ????????????zeroSerNum ++ ;???????????????????????????????? // 連續0次數遞增
    ???????????? if (zero? == ? ' 0 ' ){?????????????????????????????? // 標志
    ??????????????zero = digit[ 0 ];
    ????????????}?
    else ? if (idx == 0 ? && ?vidx? > 0 ? && zeroSerNum? < ? 4 ){
    ??????????????prefix?
    += ?vunit[vidx - 1 ];
    ??????????????zero
    = ' 0 ' ;
    ????????????}
    ????????????
    continue ;
    ??????????}
    ??????????zeroSerNum?
    = ? 0 ;???????????????????????????????? // 連續0次數清零
    ?????????? if (zero? != ? ' 0 ' )?{?????????????????????????????? // 如果標志不為0,則加上,例如萬,億什么的
    ????????????prefix += zero;
    ????????????zero
    = ' 0 ' ;
    ??????????}
    ??????????prefix
    += digit[chDig[i] - ' 0 ' ];?????????????????? // 轉化該數字表示
    ?????????? if (idx? > ? 0 )?prefix? += ?hunit[idx - 1 ];??????????????????
    ??????????
    if (idx == 0 ? && ?vidx > 0 ){
    ????????????prefix
    += vunit[vidx - 1 ];????????????????????? // 段結束位置應該加上段名如萬,億
    ??????????}
    ????????}

    ????????
    if (prefix.length()? > ? 0 )?prefix? += ? ' ' ;???????? // 如果整數部分存在,則有圓的字樣
    ???????? return ?prefix + suffix;????????????????????????? // 返回正確表示
    ??????}
    posted on 2006-11-02 10:34 蘆葦 閱讀(3912) 評論(8)  編輯  收藏

    Feedback

    # re: 人民幣大寫轉換 2007-10-28 19:22 QQ745224544
    謝謝你了 學習了  回復  更多評論
      

    # re: 人民幣大寫轉換[未登錄] 2007-10-29 08:35 蘆葦
    @QQ745224544

    不客氣,這是轉別人的文章,我同樣感激原創作者!
      回復  更多評論
      

    # re: 人民幣大寫轉換 2008-01-08 10:11 車日
    102.30  回復  更多評論
      

    # re: 人民幣大寫轉換 2008-01-23 09:52 郭潔穎
    21682.50  回復  更多評論
      

    # re: 人民幣大寫轉換 2009-01-21 01:43 人民幣
    謝謝你了  回復  更多評論
      

    # re: 人民幣大寫轉換 2011-05-24 21:44 dsaf
    不行啊,600001  回復  更多評論
      

    # re: 人民幣大寫轉換 2011-09-29 20:53 有問題
    100001:壹拾零壹圓整
    1000000001:壹拾零壹圓整  回復  更多評論
      

    # re: 人民幣大寫轉換[未登錄] 2013-09-12 20:47 JoJo
    1980300  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 精品国产_亚洲人成在线高清| 免费无码看av的网站| 亚洲欧洲国产精品香蕉网| 免费夜色污私人影院网站电影| 四虎影院永久免费观看| 美女扒开尿口给男人爽免费视频| 日产国产精品亚洲系列| 国产精品极品美女自在线观看免费| 国产精品亚洲玖玖玖在线观看| 一级一级一级毛片免费毛片| 中文亚洲AV片不卡在线观看| 国产麻豆一精品一AV一免费| 亚洲黄色网址大全| 三年片在线观看免费大全| 亚洲欧美aⅴ在线资源| 国产免费啪嗒啪嗒视频看看| 色吊丝性永久免费看码| 国产亚洲精品无码拍拍拍色欲| a级毛片免费在线观看| 亚洲一区二区三区高清| 久久天天躁狠狠躁夜夜免费观看 | 四虎精品视频在线永久免费观看| 亚洲人成网站18禁止久久影院| 永久免费bbbbbb视频| 一本岛v免费不卡一二三区| 亚洲大尺度无码无码专区| 久久久久久精品免费免费自慰| 亚洲欧美日韩综合久久久久| 国产乱辈通伦影片在线播放亚洲 | 无码国产精品一区二区免费虚拟VR | 深夜a级毛片免费视频| 亚洲精品乱码久久久久久蜜桃不卡| 国产激情免费视频在线观看| 日韩亚洲产在线观看| ZZIJZZIJ亚洲日本少妇JIZJIZ| 一级毛片免费观看| 亚洲av午夜国产精品无码中文字| 亚洲自偷自偷图片| 成年女人毛片免费播放视频m| 国产免费区在线观看十分钟 | 成人电影在线免费观看|