金額轉人民幣大寫是一種常見的要求,但是這一看似簡單的要求,實現起來卻並不容易。
前不久,我被問到了這樣一道題,當時寫了個演算法,昨天晚上又和BJDP的人們討論了一下,覺得很有必要把這個演算法寫下來。
總共37行,去掉空行還不到30行,就不多囉嗦解釋了。
1 public class ChineseCurrencyConverter { 2 3 private static final String[] UNITS = {"億","仟","佰","拾","萬","仟","佰","拾","" }; 4 private static final String[] CHINESE_NUMBER = {"零","壹","貳","三","肆","伍","陸","柒","捌","玖"}; 5 6 public static String convert(long yuan) { 7 8 if (yuan >= 1e9 || yuan < 0) { 9 return "這個數字超出解析範圍了";10 }11 String amount = String.valueOf(yuan);12 int len = amount.length();13 int unitsLen = UNITS.length;14 15 String chineseCurrency = "";16 for (int i = len - 1; i >= 0; i--) {17 chineseCurrency = number(amount.charAt(i)) + unit(amount.charAt(i), unitsLen - len + i) +chineseCurrency;18 }19 20 chineseCurrency = chineseCurrency.replaceAll("零+","零");21 chineseCurrency = chineseCurrency + "元整";22 chineseCurrency = chineseCurrency.replaceAll("零萬","萬");23 chineseCurrency = chineseCurrency.replaceAll("零元","元");24 return chineseCurrency;25 }26 27 private static String number(char number) {28 return CHINESE_NUMBER[Integer.parseInt(String.valueOf(number))];29 }30 31 private static String unit(char number, int pos) {32 if(number == '0' && pos != UNITS.length - 5) {33 return "";34 }35 return UNITS[pos];36 }37 }
下面是一些用來測試的代碼:
1 public class TestConverter { 2 3 public static void main(String[] args) { 4 System.out.println(ChineseCurrencyConverter.convert(100)); 5 System.out.println(ChineseCurrencyConverter.convert(130)); 6 System.out.println(ChineseCurrencyConverter.convert(102)); 7 System.out.println(ChineseCurrencyConverter.convert(124)); 8 System.out.println(ChineseCurrencyConverter.convert(1000)); 9 System.out.println(ChineseCurrencyConverter.convert(10000));10 System.out.println(ChineseCurrencyConverter.convert(100000));11 System.out.println(ChineseCurrencyConverter.convert(1000000));12 System.out.println(ChineseCurrencyConverter.convert(10000000));13 System.out.println(ChineseCurrencyConverter.convert(10000000));14 System.out.println(ChineseCurrencyConverter.convert(100000000));15 System.out.println(ChineseCurrencyConverter.convert(1000000000));16 System.out.println(ChineseCurrencyConverter.convert(1002));17 System.out.println(ChineseCurrencyConverter.convert(1020));18 System.out.println(ChineseCurrencyConverter.convert(1200));19 System.out.println(ChineseCurrencyConverter.convert(10003));20 System.out.println(ChineseCurrencyConverter.convert(10030));21 System.out.println(ChineseCurrencyConverter.convert(10033));22 System.out.println(ChineseCurrencyConverter.convert(10330));23 System.out.println(ChineseCurrencyConverter.convert(13030));24 System.out.println(ChineseCurrencyConverter.convert(100030));25 System.out.println(ChineseCurrencyConverter.convert(100003));26 System.out.println(ChineseCurrencyConverter.convert(100300));27 System.out.println(ChineseCurrencyConverter.convert(103000));28 System.out.println(ChineseCurrencyConverter.convert(100303));29 System.out.println(ChineseCurrencyConverter.convert(1000004));30 System.out.println(ChineseCurrencyConverter.convert(10000005));31 System.out.println(ChineseCurrencyConverter.convert(10000006));32 System.out.println(ChineseCurrencyConverter.convert(12000006));33 System.out.println(ChineseCurrencyConverter.convert(10030006));34 System.out.println(ChineseCurrencyConverter.convert(10200006));35 System.out.println(ChineseCurrencyConverter.convert(100000007));36 System.out.println(ChineseCurrencyConverter.convert(1000000008));37 38 }39 }
這些數字測試的結果還都正確。
這裡沒有處理角和分,留給有想法的同學去嘗試一下吧。