1.将汉语中的金额数字(含有,分隔符)转成大写金额表达字符,返回一个字符
public class Amount2RMB2 {
private static final Pattern AMOUNT_PATTERN =
Pattern.compile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)$");
private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();
private static final String[] UNITS = {"元", "角", "分", "整"};
private static final String[] U1 = {"", "拾", "佰", "仟"};
private static final String[] U2 = {"", "万", "亿"};
/**
* 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式.
* @param amount 金额数字
* @return 中文大写
* @throws IllegalArgumentException
*/
public static String convert(String amount) throws IllegalArgumentException {
amount = amount.replace(",", "");
if (amount.equals("0.00")) {
throw new IllegalArgumentException("金额不能为零.");
}
Matcher matcher = AMOUNT_PATTERN.matcher(amount);
if (! matcher.find()) {
throw new IllegalArgumentException("输入金额有误.");
}
String integer = matcher.group(1);
String fraction = matcher.group(2);
String result = "";
if (! integer.equals("0")) {
result += integer2rmb(integer) + UNITS[0];
}
if (fraction.equals("00")) {
result += UNITS[3];
} else if (fraction.startsWith("0") && integer.equals("0")) {
result += fraction2rmb(fraction).substring(1);
} else {
result += fraction2rmb(fraction);
}
return result;
}
private static String fraction2rmb(String fraction) {
char jiao = fraction.charAt(0);
char fen = fraction.charAt(1);
return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : ""))
+ (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");
}
private static String integer2rmb(String integer) {
StringBuilder buffer = new StringBuilder();
int i, j;
for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {
char n = integer.charAt(i);
if (n == '0') {
if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {
buffer.append(RMB_NUMS[0]);
}
if (j % 4 == 0) {
if (i > 0 && integer.charAt(i - 1) != '0'
|| i > 1 && integer.charAt(i - 2) != '0'
|| i > 2 && integer.charAt(i - 3) != '0') {
buffer.append(U2[j / 4]);
}
}
} else {
if (j % 4 == 0) {
buffer.append(U2[j / 4]);
}
buffer.append(U1[j % 4]);
buffer.append(RMB_NUMS[n - '0']);
}
}
return buffer.reverse().toString();
}
public static void main(String[] args) {
System.out.println("壹万陆仟肆佰零玖元零贰分".equals(convert("16,409.02")));
System.out.println("壹仟肆佰零玖元伍角".equals(convert("1,409.50")));
System.out.println("陆仟零柒元壹角肆分".equals(convert("6,007.14")));
System.out.println("壹仟陆佰捌拾元叁角贰分".equals(convert("1,680.32")));
System.out.println("叁佰贰拾伍元零肆分".equals(convert("325.04")));
System.out.println("肆仟叁佰贰拾壹元整".equals(convert("4,321.00")));
System.out.println("壹分".equals(convert("0.01")));
System.out.println(convert("1234,5678,9012.34")
.equals("壹仟贰佰叁拾肆亿伍仟陆佰柒拾捌万玖仟零壹拾贰元叁角肆分"));
System.out.println(convert("1000,1000,1000.10")
.equals("壹仟亿零壹仟万零壹仟元壹角"));
System.out.println(convert("9009,9009,9009.99")
.equals("玖仟零玖亿玖仟零玖万玖仟零玖元玖角玖分"));
System.out.println(convert("5432,0001,0001.01")
.equals("伍仟肆佰叁拾贰亿零壹万零壹元零壹分"));
System.out.println(convert("1000,0000,1110.00")
.equals("壹仟亿零壹仟壹佰壹拾元整"));
System.out.println(convert("1010,0000,0001.11")
.equals("壹仟零壹拾亿零壹元壹角壹分"));
System.out.println(convert("1000,0000,0000.01")
.equals("壹仟亿元零壹分"));
}
}
2.将汉语中的数字转成大写,返回一个map
public class Amount2RMB {
/**
* 汉语中数字大写
*/
private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆",
"伍", "陆", "柒", "捌", "玖" };
/**
* 汉语中货币单位大写,这样的设计类似于占位符
*/
private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元",
"拾", "佰", "仟", "万", "拾", "佰"};
private static final String[] CN_UPPER_MONETRAY_UNIT_MAP = {"fen","horn","yuan", "ten", "hundred", "housand",
"tenThousand", "oneHundredThousand", "million"};
private static final int MONEY_PRECISION = 2;
/**
* 特殊字符:零元整
*/
private static final String CN_ZEOR = "零";
/**
* 把输入的金额转换为汉语中人民币的大写
*
* @param numberOfMoney
* 输入的金额
* @return 对应的汉语大写
*/
public static Map<String, String> number2CNMontrayUnit(BigDecimal numberOfMoney) {
Map<String, String> rmbMap=new HashMap<String, String>();
int signum = numberOfMoney.signum();
if (signum == 0) {
for (int i = 0; i < CN_UPPER_MONETRAY_UNIT_MAP.length; i++)
{
rmbMap.put(CN_UPPER_MONETRAY_UNIT_MAP[i], CN_ZEOR);
}
return rmbMap;
}
long number = numberOfMoney.movePointRight(MONEY_PRECISION)
.setScale(0, 4).abs().longValue();
System.out.println(number);
int numUnit = 0;
for (int i = 0; i < CN_UPPER_MONETRAY_UNIT_MAP.length; i++)
{
if (number >= 0) {
numUnit = (int) (number % 10);
rmbMap.put(CN_UPPER_MONETRAY_UNIT_MAP[i], CN_UPPER_NUMBER[numUnit]);
number = number / 10;
}else {
rmbMap.put(CN_UPPER_MONETRAY_UNIT_MAP[i], CN_ZEOR);
}
}
return rmbMap;
}
}