Java數字轉漢字,數字轉大寫

網上找了一圈,都不合我意,自己花點時間寫了一下。
數字不好,邏輯差了點,性能應該還可以。
如果需要修改爲轉財務大寫或轉換爲語音文件的,可以簡單把漢字改一個就行。

package com.lixor;

import java.util.ArrayList;
import java.util.Collections;

/**
* 數字轉中文。最大支持到萬億級別。
*
* @author alex
*
*/
public class Num2CN {
/**
* 單位進位,中文默認爲4位即(萬、億)
*/
public int UNIT_STEP = 4;

/**
* 單位
*/
public String[] CN_UNITS = new String[] { "個", "十", "百", "千", "萬", "十",
"百", "千", "億", "十", "百", "千", "萬" };

/**
* 漢字
*/
public String[] CN_CHARS = new String[] { "零", "一", "二", "三", "四",
"五", "六", "七", "八", "九" };

/**
* 數值轉換爲中文字符串
*
* @param num
* 需要轉換的數值
* @return
*/
public String cvt(long num) {
return this.cvt(num, false);
}

/**
* 數值轉換爲中文字符串(口語化)
*
* @param num
* 需要轉換的數值
* @param isColloquial
* 是否口語化。例如12轉換爲'十二'而不是'一十二'。
* @return
*/
public String cvt(long num, boolean isColloquial) {
String[] result = this.convert(num, isColloquial);
StringBuffer strs = new StringBuffer(32);
for (String str : result) {
strs.append(str);
}
return strs.toString();
}

/**
* 將數值轉換爲中文
*
* @param num
* 需要轉換的數值
* @param isColloquial
* 是否口語化。例如12轉換爲'十二'而不是'一十二'。
* @return
*/
public String[] convert(long num, boolean isColloquial) {
if (num < 10) {// 10以下直接返回對應漢字
return new String[] { CN_CHARS[(int) num] };// ASCII2int
}

char[] chars = String.valueOf(num).toCharArray();
if (chars.length > CN_UNITS.length) {// 超過單位表示範圍的返回空
return new String[] {};
}

boolean isLastUnitStep = false;// 記錄上次單位進位
ArrayList<String> cnchars = new ArrayList<String>(chars.length * 2);// 創建數組,將數字填入單位對應的位置
for (int pos = chars.length - 1; pos >= 0; pos--) {// 從低位向高位循環
char ch = chars[pos];
String cnChar = CN_CHARS[ch - '0'];// ascii2int 漢字
int unitPos = chars.length - pos - 1;// 對應的單位座標
String cnUnit = CN_UNITS[unitPos];// 單位
boolean isZero = (ch == '0');// 是否爲0
boolean isZeroLow = (pos + 1 < chars.length && chars[pos + 1] == '0');// 是否低位爲0

boolean isUnitStep = (unitPos >= UNIT_STEP && (unitPos % UNIT_STEP == 0));// 當前位是否需要單位進位

if (isUnitStep && isLastUnitStep) {// 去除相鄰的上一個單位進位
int size = cnchars.size();
cnchars.remove(size - 1);
if (!CN_CHARS[0].equals(cnchars.get(size - 2))) {// 補0
cnchars.add(CN_CHARS[0]);
}
}

if (isUnitStep || !isZero) {// 單位進位(萬、億),或者非0時加上單位
cnchars.add(cnUnit);
isLastUnitStep = isUnitStep;
}
if (isZero && (isZeroLow || isUnitStep)) {// 當前位爲0低位爲0,或者當前位爲0並且爲單位進位時進行省略
continue;
}
cnchars.add(cnChar);
isLastUnitStep = false;
}

Collections.reverse(cnchars);
// 清除最後一位的0
int chSize = cnchars.size();
String chEnd = cnchars.get(chSize - 1);
if (CN_CHARS[0].equals(chEnd) || CN_UNITS[0].equals(chEnd)) {
cnchars.remove(chSize - 1);
}

// 口語化處理
if (isColloquial) {
String chFirst = cnchars.get(0);
String chSecond = cnchars.get(1);
if (chFirst.equals(CN_CHARS[1]) && chSecond.startsWith(CN_UNITS[1])) {// 是否以'一'開頭,緊跟'十'
cnchars.remove(0);
}
}
return cnchars.toArray(new String[] {});
}

public static void main(String[] args) {
String[] testData = ("0,1,2,3,4,5,6,7,8,9,"
+ "10,11,20,91,"
+ "110,102,1234,1023,1002,"
+ "10000,12345,10234,10023,10002,12034,12003,12000,12300,12340,"
+ "100000,123456,102345,200234,100023,100002,120345,120034,120003,120000,123000,123400,123450,"
+ "1000000,1234567,2023456,1002345,3000234,1000023,1000002,1203456,1200345,1200034,1200003,1200000,1230000,1234000,1234500,1234560,"
+ "10000000,12345678,10234567,10023456,10002345,10000234,10000023,12034567,12003456,12000345,12000034,12000003,12000000,12300000,12340000,12345600,12345670,"
+ "1000000000,1234567890,1023456789,1002300078,1000230067,1000023456,1000002345,1203456789,1200345678,1200034567,1200003456,1200000345,1200000034,1200000003,1230000000,1234000000,1234500000,1234560000,1234567000,1234567800,1234567890,"

+ String.valueOf(Integer.MAX_VALUE)

+ ",9223372036854,9002233007200").split(",");
for (String data : testData) {
long num = Long.parseLong(data);

if (num < 0) {
continue;
}

System.out.println(String.format("%-12s \t %s", data,
new Num2CN().cvt(num,true)));

}

}
}



運行結果

0 零
1 一
2 二
3 三
4 四
5 五
6 六
7 七
8 八
9 九
10 十
11 十一
20 二十
91 九十一
110 一百一十
102 一百零二
1234 一千二百三十四
1023 一千零二十三
1002 一千零二
10000 一萬
12345 一萬二千三百四十五
10234 一萬零二百三十四
10023 一萬零二十三
10002 一萬零二
12034 一萬二千零三十四
12003 一萬二千零三
12000 一萬二千
12300 一萬二千三百
12340 一萬二千三百四十
100000 十萬
123456 十二萬三千四百五十六
102345 十萬二千三百四十五
200234 二十萬零二百三十四
100023 十萬零二十三
100002 十萬零二
120345 十二萬零三百四十五
120034 十二萬零三十四
120003 十二萬零三
120000 十二萬
123000 十二萬三千
123400 十二萬三千四百
123450 十二萬三千四百五十
1000000 一百萬
1234567 一百二十三萬四千五百六十七
2023456 二百零二萬三千四百五十六
1002345 一百萬二千三百四十五
3000234 三百萬零二百三十四
1000023 一百萬零二十三
1000002 一百萬零二
1203456 一百二十萬三千四百五十六
1200345 一百二十萬零三百四十五
1200034 一百二十萬零三十四
1200003 一百二十萬零三
1200000 一百二十萬
1230000 一百二十三萬
1234000 一百二十三萬四千
1234500 一百二十三萬四千五百
1234560 一百二十三萬四千五百六十
10000000 一千萬
12345678 一千二百三十四萬五千六百七十八
10234567 一千零二十三萬四千五百六十七
10023456 一千零二萬三千四百五十六
10002345 一千萬二千三百四十五
10000234 一千萬零二百三十四
10000023 一千萬零二十三
12034567 一千二百零三萬四千五百六十七
12003456 一千二百萬三千四百五十六
12000345 一千二百萬零三百四十五
12000034 一千二百萬零三十四
12000003 一千二百萬零三
12000000 一千二百萬
12300000 一千二百三十萬
12340000 一千二百三十四萬
12345600 一千二百三十四萬五千六百
12345670 一千二百三十四萬五千六百七十
1000000000 十億
1234567890 十二億三千四百五十六萬七千八百九十
1023456789 十億二千三百四十五萬六千七百八十九
1002300078 十億零二百三十萬零七十八
1000230067 十億零二十三萬零六十七
1000023456 十億零二萬三千四百五十六
1000002345 十億零二千三百四十五
1203456789 十二億零三百四十五萬六千七百八十九
1200345678 十二億零三十四萬五千六百七十八
1200034567 十二億零三萬四千五百六十七
1200003456 十二億零三千四百五十六
1200000345 十二億零三百四十五
1200000034 十二億零三十四
1200000003 十二億零三
1230000000 十二億三千萬
1234000000 十二億三千四百萬
1234500000 十二億三千四百五十萬
1234560000 十二億三千四百五十六萬
1234567000 十二億三千四百五十六萬七千
1234567800 十二億三千四百五十六萬七千八百
1234567890 十二億三千四百五十六萬七千八百九十
2147483647 二十一億四千七百四十八萬三千六百四十七
9223372036854 九萬二千二百三十三億七千二百零三萬六千八百五十四
9002233007200 九萬零二十二億三千三百萬七千二百


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章