人民幣大寫轉換為數字
阿新 • • 發佈:2019-01-28
public class RMBUtils {
/**
* 中文中簡寫的漢字金額 經常使用
*/
public static final String[] RMB_NUMBERS = new String[] { "一", "二", "三",
"四", "五", "六", "七", "八", "九", "兩", "廿", "卅", "○" };
/**
* 中文中繁寫的漢字金額 經常使用
*/
public static final String[] BIG_RMB_NUMBERS = new String[] { "壹", "貳",
"叄", "肆", "伍", "陸", "柒", "捌", "玖", "倆", "廿", "卅", "零" };// 大寫的漢字
/**
* 與漢字相應的轉化的數字
*/
public static final Long[] TO_ARABIC_NUMBERS = new Long[] { 1L, 2L, 3L, 4L,
5L, 6L, 7L, 8L, 9L, 2L, 2L, 3L, 0L };// 轉化為阿拉伯數字
/**
* 人民幣單位關鍵詞(即大寫數字倍數) 簡寫 注意:一定要由大到小
*/
public static final String[] RMB_UNIT = new String[] { "億", "萬", "千", "百",
"十", "元", "角", "分", "釐" };// 中文中間隔的倍數
/**
* 人民幣單位關鍵詞 繁體寫
*/
public static final String[] BIG_RMB_UNIT = new String[] { "億", "萬", "仟",
"佰", "拾", "圓", "角", "分", "釐" };
/**
* 與人民幣單位關鍵詞對應的基數
*/
public static final BigDecimal[] TO_CARDINAL_NUMBERS = new BigDecimal[] {
new BigDecimal(100000000L), new BigDecimal(10000L),
new BigDecimal(1000L), new BigDecimal(100L), BigDecimal.TEN,
BigDecimal.ONE, new BigDecimal("0.1"), new BigDecimal("0.01"),
new BigDecimal("0.001") };// 轉化為阿拉伯的倍數
/**
* 大寫轉化為小寫的過程操作
*
* @param money
* 大寫金額
* @return
*/
public static String covertToDigital(String money) {
BigDecimal number = getDigitalNum(money);
return number.toString();
}
/**
* 輔助類,處理中文數字轉換成阿拉伯數字,利用遞迴演算法
*
* @param money
* 人民幣大寫
* @return
*/
private static BigDecimal getDigitalNum(String money) {
BigDecimal result = BigDecimal.ZERO;
if ((money == null || money.trim().length() <= 0)) {
return result;
}
// 匹配大寫金額的單位
for (int i = 0; i < RMB_UNIT.length; i++) {
// 查詢字元中的簡、繁單位
int index = money.lastIndexOf(RMB_UNIT[i]) == -1 ? money
.lastIndexOf(BIG_RMB_UNIT[i]) : money
.lastIndexOf(RMB_UNIT[i]);
if (index >= 0) {
String pre_money = money.substring(0, index); // 擷取當前單位的
// 前面的中文字串
money = money.substring(index + 1); // 擷取當前單位後面的字串 ,進行下一次迭代比較
if ((pre_money == null || pre_money.length() <= 0)
&& TO_CARDINAL_NUMBERS[i].intValue() == 10) { // 處理拾開頭的特殊字元 例如 拾、 十
result = result.add(TO_CARDINAL_NUMBERS[i]);
} else { // 對當前單位擷取的前面的字元 遞迴處理
result = result.add(getDigitalNum(pre_money).multiply(
TO_CARDINAL_NUMBERS[i]));
}
}
}
// 如果不帶單位 直接阿拉伯數字匹配替換
if (money != null && money.length() > 0) {
result = result.add(getArabicNumByBig(money));
}
return result;
}
/**
* 輔助類,中文數字 轉化為對應的阿拉伯數字
*
* @param big
* @return
*/
private static BigDecimal getArabicNumByBig(String big) {
BigDecimal result = BigDecimal.ZERO;
for (int j = 0; j < RMB_NUMBERS.length; j++) {
big = big.replaceAll(RMB_NUMBERS[j],
TO_ARABIC_NUMBERS[j].toString()); // 中文小寫替換
big = big.replaceAll(BIG_RMB_NUMBERS[j],
TO_ARABIC_NUMBERS[j].toString());// 中文大寫替換
}
try {
result = new BigDecimal(big);
} catch (Exception e) {
result = BigDecimal.ZERO;
}
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
// System.out.println("---------------------測試資料----------------");
System.out.println(covertToDigital("陸仟萬元整"));
System.out.println(covertToDigital("一百萬億兩分"));
System.out.println(covertToDigital("壹萬億"));
System.out.println(covertToDigital("貳萬億"));
System.out.println(covertToDigital("叄萬億"));
System.out.println(covertToDigital("肆萬億"));
System.out.println(covertToDigital("伍萬億"));
System.out.println(covertToDigital("陸萬億"));
System.out.println(covertToDigital("柒萬億"));
System.out.println(covertToDigital("捌萬億"));
System.out.println(covertToDigital("玖萬億"));
System.out.println(covertToDigital("拾萬億"));
System.out.println(covertToDigital("十一元三角兩分"));
System.out.println(covertToDigital("十一元"));
}
}
/**
* 中文中簡寫的漢字金額 經常使用
*/
public static final String[] RMB_NUMBERS = new String[] { "一", "二", "三",
"四", "五", "六", "七", "八", "九", "兩", "廿", "卅", "○" };
/**
* 中文中繁寫的漢字金額 經常使用
*/
public static final String[] BIG_RMB_NUMBERS = new String[] { "壹", "貳",
"叄", "肆", "伍", "陸", "柒", "捌", "玖", "倆", "廿", "卅", "零" };// 大寫的漢字
/**
* 與漢字相應的轉化的數字
*/
public static final Long[] TO_ARABIC_NUMBERS = new Long[] { 1L, 2L, 3L, 4L,
5L, 6L, 7L, 8L, 9L, 2L, 2L, 3L, 0L };// 轉化為阿拉伯數字
/**
* 人民幣單位關鍵詞(即大寫數字倍數) 簡寫 注意:一定要由大到小
*/
public static final String[] RMB_UNIT = new String[] { "億", "萬", "千", "百",
"十", "元", "角", "分", "釐" };// 中文中間隔的倍數
/**
* 人民幣單位關鍵詞 繁體寫
*/
public static final String[] BIG_RMB_UNIT = new String[] { "億", "萬", "仟",
"佰", "拾", "圓", "角", "分", "釐" };
/**
* 與人民幣單位關鍵詞對應的基數
*/
public static final BigDecimal[] TO_CARDINAL_NUMBERS = new BigDecimal[] {
new BigDecimal(100000000L), new BigDecimal(10000L),
new BigDecimal(1000L), new BigDecimal(100L), BigDecimal.TEN,
BigDecimal.ONE, new BigDecimal("0.1"), new BigDecimal("0.01"),
new BigDecimal("0.001") };// 轉化為阿拉伯的倍數
/**
* 大寫轉化為小寫的過程操作
*
* @param money
* 大寫金額
* @return
*/
public static String covertToDigital(String money) {
BigDecimal number = getDigitalNum(money);
return number.toString();
}
/**
* 輔助類,處理中文數字轉換成阿拉伯數字,利用遞迴演算法
*
* @param money
* 人民幣大寫
* @return
*/
private static BigDecimal getDigitalNum(String money) {
BigDecimal result = BigDecimal.ZERO;
if ((money == null || money.trim().length() <= 0)) {
return result;
}
// 匹配大寫金額的單位
for (int i = 0; i < RMB_UNIT.length; i++) {
// 查詢字元中的簡、繁單位
int index = money.lastIndexOf(RMB_UNIT[i]) == -1 ? money
.lastIndexOf(BIG_RMB_UNIT[i]) : money
.lastIndexOf(RMB_UNIT[i]);
if (index >= 0) {
String pre_money = money.substring(0, index); // 擷取當前單位的
// 前面的中文字串
money = money.substring(index + 1); // 擷取當前單位後面的字串 ,進行下一次迭代比較
if ((pre_money == null || pre_money.length() <= 0)
&& TO_CARDINAL_NUMBERS[i].intValue() == 10) { // 處理拾開頭的特殊字元 例如 拾、 十
result = result.add(TO_CARDINAL_NUMBERS[i]);
} else { // 對當前單位擷取的前面的字元 遞迴處理
result = result.add(getDigitalNum(pre_money).multiply(
TO_CARDINAL_NUMBERS[i]));
}
}
}
// 如果不帶單位 直接阿拉伯數字匹配替換
if (money != null && money.length() > 0) {
result = result.add(getArabicNumByBig(money));
}
return result;
}
/**
* 輔助類,中文數字 轉化為對應的阿拉伯數字
*
* @param big
* @return
*/
private static BigDecimal getArabicNumByBig(String big) {
BigDecimal result = BigDecimal.ZERO;
for (int j = 0; j < RMB_NUMBERS.length; j++) {
big = big.replaceAll(RMB_NUMBERS[j],
TO_ARABIC_NUMBERS[j].toString()); // 中文小寫替換
big = big.replaceAll(BIG_RMB_NUMBERS[j],
TO_ARABIC_NUMBERS[j].toString());// 中文大寫替換
}
try {
result = new BigDecimal(big);
} catch (Exception e) {
result = BigDecimal.ZERO;
}
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
// System.out.println("---------------------測試資料----------------");
System.out.println(covertToDigital("陸仟萬元整"));
System.out.println(covertToDigital("一百萬億兩分"));
System.out.println(covertToDigital("壹萬億"));
System.out.println(covertToDigital("貳萬億"));
System.out.println(covertToDigital("叄萬億"));
System.out.println(covertToDigital("肆萬億"));
System.out.println(covertToDigital("伍萬億"));
System.out.println(covertToDigital("陸萬億"));
System.out.println(covertToDigital("柒萬億"));
System.out.println(covertToDigital("捌萬億"));
System.out.println(covertToDigital("玖萬億"));
System.out.println(covertToDigital("拾萬億"));
System.out.println(covertToDigital("十一元三角兩分"));
System.out.println(covertToDigital("十一元"));
}
}