package app.pattern;
import java.math.BigDecimal;
import java.text.DecimalFormat;
/**
* 还是有点小bug,超过1亿后就会出现小问题;
* 金额大小写转换工具类
* @author muyx
*/
public class FigureTransformUtil {
//金额大写数组,和数组下标对应
private static final String numberChineseUppercase[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
//金额单位
private static final String units[] = { "分", "角", "元", "", "拾", "百", "千", "万", "拾", "百", "千", "亿", "拾", "百", "千",
"万", "拾", "百", "千" };
private static final String pattern = "#,###.00";
private static final DecimalFormat decimalFormat = new DecimalFormat(pattern);
public static void main(String[] args) {
String[] testData = { /*"12", "12.01", "102.00", "102.01", "100,000", "102,002.46", "12,000,003,034.90",
*/"1230000000011111.45" };
for (int i = 0; i < testData.length; i++) {
System.out.println(toMoneyStyle(testData[i]));
System.out.println(toChineseUppercase(testData[i]));
}
}
public static String toMoneyStyle(double number) {
return decimalFormat.format(number);
}
public static String toMoneyStyle(String number) {
return toMoneyStyle(numberToBigDecimal(number).doubleValue());
}
public static String toChineseUppercase(String money) {
BigDecimal bigDecimal = numberToBigDecimal(money);
char[] charArray = bigDecimal.toString().toCharArray();
StringBuilder chineseUppercase = new StringBuilder();
String prefixZeroBuffer = "";
for (int i = 0, len = charArray.length; i < len; i++) {
//单位("分", "角", "元"....)数组的下标位置;
int unitLocation = len - i - 1;
if (charArray[i] != '.') {
int point = Integer.valueOf(charArray[i] + "");
if (point == 0) {
if (unitLocation == 7 || unitLocation == 11 || unitLocation == 15) {//无论怎么都不能少的处理
chineseUppercase.append(units[unitLocation]);
prefixZeroBuffer = "";
} else {
prefixZeroBuffer = numberChineseUppercase[point];
}
} else {
//当前位置不为0时,零的缓存+数字大写+单位
chineseUppercase.append(prefixZeroBuffer).append(numberChineseUppercase[point])
.append(units[unitLocation]);
prefixZeroBuffer = "";
}
} else {
chineseUppercase.append(units[unitLocation]);
prefixZeroBuffer = "";
}
}
return chineseUppercase.toString();
}
/**
* 格式检查,并转换成BigDecimal
*/
private static BigDecimal numberToBigDecimal(String moneyNumer) {
BigDecimal money = null;
moneyNumer = moneyNumer.trim().replaceAll(",", "");//替换千分位
if (moneyNumer.indexOf(".") == -1)
moneyNumer += ".00";
String regex = "[+|-]?\\d+(\\.{1}\\d{2})?";
if (moneyNumer.matches(regex) && (moneyNumer.length() - 1) < units.length) {
money = new BigDecimal(moneyNumer);
} else {
throw new RuntimeException("金额格式不正确");
}
return money;
}
}