數(shù)字金額的中文大小寫(xiě)轉(zhuǎn)化

          曾經(jīng)去過(guò)一家公司面試。筆試題的最后一題是一個(gè)數(shù)字金額大小寫(xiě)轉(zhuǎn)化的問(wèn)題。
          當(dāng)時(shí)沒(méi)想那么多,僅僅想到應(yīng)該把數(shù)拆開(kāi)然后添加單位的一個(gè)大致的設(shè)計(jì)思路。
          而那個(gè)面試官一個(gè)勁兒的問(wèn)我用啥算法。那個(gè)題最后也沒(méi)答上,回來(lái)后比較郁悶,
          在網(wǎng)上搜了一下。這個(gè)答案還真不少。不過(guò)覺(jué)得有一種設(shè)計(jì)還比較靠譜。
          大概是這樣:
           * 先將整數(shù)與小數(shù)部分分開(kāi),計(jì)算小數(shù)部分,角分并保存
           * 整數(shù)部分長(zhǎng)度不足12位,前面加0補(bǔ)足。
           * 將整數(shù)部分分割3部分。高4位代表億,中間的是萬(wàn),其余分別代表千,百,十,個(gè)
           * 定一個(gè)方法拼出每一部分串。
           * 最后整數(shù)與小數(shù)部分合成。

          自己實(shí)現(xiàn)了一下,以下是代碼。
          code :

          package com.kangdy.test;
          /**
           * 數(shù)字金額轉(zhuǎn)化成大寫(xiě)
           * 先將整數(shù)與小數(shù)部分分開(kāi),計(jì)算小數(shù)部分,角分并保存
           * 整數(shù)部分長(zhǎng)度不足12位,前面加0補(bǔ)足。
           * 將整數(shù)部分分割3部分。高4位代表億,中間的是萬(wàn),其余分別代表千,百,十,個(gè)
           * 定一個(gè)方法拼出每一部分串。
           * 最后整數(shù)與小數(shù)部分合成。
           * @author dkang
           *
           */
          public class NumberToString {

           String numberStr;

           public static final String unit[] = { "", "十", "百", "千", "萬(wàn)", "億" };

           public static final String unit2[] = { "元", "角", "分" };

           public static final String numStr[] = { "零", "壹", "貳", "叁", "肆", "伍", "陸",
             "柒", "捌", "玖" };

           /**
            * 字符串長(zhǎng)度不足12位用0補(bǔ)足
            *
            * @param str
            * @return
            */
           private String additionalZero(String str) {
            StringBuffer strb = new StringBuffer();
            if (str.length() < 12) {
             int size = 12 - str.length();
             for (int i = 0; i < size; i++) {
              strb.append("0");
             }
            }
            return strb.append(str).toString();
           }

           /**
            * 遞歸拆分?jǐn)?shù)字成字符串
            *
            * @param value
            * @param strBuffer
            * @return
            */
           private String decomposeNumberToString(int value, StringBuffer strBuffer) {
            int quotient = 0;
            quotient = value / 10;
            if (quotient != 0) {
             decomposeNumberToString(quotient, strBuffer);
            }
            int remaider = value % 10;
            strBuffer.append(remaider + ",");
            return strBuffer.toString().substring(0,
              strBuffer.toString().length() - 1);
           }

           /**
            * 使用循環(huán)拆分?jǐn)?shù)字成字符串
            *
            * @param value
            * @return
            */
           private String decomposeNumberToString2(int value) {
            StringBuilder strBuilder = new StringBuilder();
            int quotient = value;
            int remaider = 0;
            while (quotient != 0) {
             remaider = quotient % 10;
             strBuilder.append(remaider + ",");
             quotient = quotient / 10;
            }
            strBuilder.deleteCharAt(strBuilder.lastIndexOf(","));
            return strBuilder.reverse().toString();
           }

           /**
            * 添加單位
            *
            * @param temp
            * @return
            */
           private String addUnits(String temp) {
            StringBuffer sb = new StringBuffer();
            String str[] = temp.split(",");
            String tempStr = temp.replace(",", "");
            if (tempStr.contains("000")) {
             return sb.append(resplaceNumToStr(str[0]) + unit[3]).toString();
            } else if (tempStr.contains("00")) {
             if (tempStr.charAt(3) == '0') {
              return sb.append(resplaceNumToStr(str[0]) + unit[3]).append(
                resplaceNumToStr(str[1]) + unit[2]).toString();
             } else {
              return sb.append(resplaceNumToStr(str[0]) + unit[3]).append(
                numStr[0]).append(resplaceNumToStr(str[3])).toString();
             }
            } else {
             for (int i = 0; i < str.length; i++) {
              sb.append(resplaceNumToStr(str[i]));
              if (!str[i].equals("0")) {
               sb.append(unit[str.length - (i + 1)]);
              }
             }
            }
            return sb.toString();
           }

           /**
            * 數(shù)字替換
            *
            * @param str
            * @return
            */
           private String resplaceNumToStr(String str) {
            try {
             int num = Integer.parseInt(str);
             return numStr[num];
            } catch (Exception e) {
             e.printStackTrace();
            }
            return "";
           }

           /**
            * 把4位長(zhǎng)度的數(shù)字轉(zhuǎn)化成字符串
            *
            * @param number
            * @param i
            * @return
            */
           private String transformNumberToString(String number, int i) {
            StringBuffer strBuffer = new StringBuffer();
            StringBuilder strBuilder = new StringBuilder();
            try {
             int num = Integer.parseInt(number);
             if (num != 0) {
              String s1 = decomposeNumberToString(num, strBuffer);
              strBuilder.append(addUnits(s1));
              if (i == 1) {
               strBuilder.append(unit[5]);
              } else if (i == 2)
               strBuilder.append(unit[4]);
             }
            } catch (Exception e) {
             e.printStackTrace();
            }
            return strBuilder.toString();
           }

           /**
            * 得到最終結(jié)果
            *
            * @param str
            * @return
            */
           public String IntegrationResultString(String str) {
            StringBuffer strBuffer = new StringBuffer();
            String numStr[] = null;
            if (str.indexOf(".") != -1) {
             numStr = str.split("\\.");
            } else {
             return strBuffer.append(createIntegerPartsResult(str)).toString();
            }
            String fractionalStr = createFractionalPartsResult(numStr[1]);
            String integerStr = createIntegerPartsResult(numStr[0]);
            return strBuffer.append(integerStr).append(fractionalStr).toString();
           }

           private String createIntegerPartsResult(String integer) {
            StringBuffer strBuffer = new StringBuffer();
            String temp = additionalZero(integer);
            String str1 = temp.substring(0, 4);
            strBuffer.append(transformNumberToString(str1, 1));
            String str2 = temp.substring(4, 8);
            strBuffer.append(transformNumberToString(str2, 2));
            String str3 = temp.substring(8, temp.length());
            strBuffer.append(transformNumberToString(str3, 3) + unit2[0]);
            return strBuffer.toString();
           }

           private String createFractionalPartsResult(String fractionalStr) {
            StringBuilder strB = new StringBuilder();
            String s1 = fractionalStr.substring(0, 1);
            String s2 = fractionalStr.substring(1, fractionalStr.length());
            if (!s1.equals("0")) {
             strB.append(resplaceNumToStr(s1) + unit2[1]);
            }
            if (!s2.equals("0")) {
             strB.append(resplaceNumToStr(s2) + unit2[2]);
            }
            return strB.toString();
           }

           public static void main(String args[]) {
            NumberToString test = new NumberToString();
            String str = "200123004054.11";
            System.out.println(test.IntegrationResultString(str));
           }
          }



          posted on 2010-11-02 14:59 AK47 閱讀(626) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): java相關(guān)

          <2010年11月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類(lèi)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 奉节县| 宁乡县| 大渡口区| 科技| 瓮安县| 西城区| 苍山县| 噶尔县| 启东市| 昌图县| 原平市| 肃南| 洛川县| 澄江县| 武穴市| 靖安县| 辛集市| 达尔| 蓬安县| 苏尼特右旗| 克什克腾旗| 莱芜市| 澎湖县| 肇庆市| 松桃| 营山县| 微博| 枝江市| 玛沁县| 新沂市| 德阳市| 鄂尔多斯市| 珠海市| 涞水县| 贵溪市| 县级市| 右玉县| 九台市| 同江市| 长治县| 涿鹿县|