今天做了一个打印,根据需求要将钱数转化为大写。研究很久写了下满的方法。
package com.kayakwise.fnc.base.util;
import java.math.BigDecimal;
import java.util.Date;
public class MoneyTools {
public static final String emptyArrayString[] = new String[0];
public static final Integer emptyArrayInteger[] = new Integer[0];
public static final BigDecimal ZERO_E_BIGDECIMAL = new BigDecimal("0E-10");
public static final Short zeroShort = Short.valueOf((short)0);
public static final Date emptyDate = new Date(0xfffffffffe488c00L);
private static final String digit[] = {
"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"
};
private static final String fraction[] = {
"角", "分"
};
private static final String digit_unit1[] = {
"", "拾", "佰", "仟"
};
private static final String digit_unit2[] = {
"元", "万", "亿"
};
private static String gbDigit(char num)
{
return digit[num - 48];
}
public static String moneyGb(String money){
StringBuffer sb_f = new StringBuffer();
StringBuffer sb_b = new StringBuffer();
char mchr[] = money.toCharArray();
int idx = money.indexOf('.');
int i;
if (idx >= 0 && idx < mchr.length - 1)
for (i = 0; i < 2; i++)
{
if (i + idx + 1 >= mchr.length)
break;
char c = mchr[i + idx + 1];
if (c != '0')
sb_b.append(gbDigit(c)).append(fraction[i]);
}
if (idx == -1)
idx = mchr.length;
i = 0;
int un1 = 0;
int un2 = 0;
for (; i < idx; i++)
{
char c = mchr[i];
un1 = ((idx - i) + 3) % digit_unit1.length;
un2 = (int)Math.floor((idx - i) / digit_unit1.length);
if (c == '0')
{
if (sb_f.length() > 0 && sb_f.lastIndexOf("零") != sb_f.length() - 1)
sb_f.append(gbDigit(c));
} else
{
sb_f.append((new StringBuilder(String.valueOf(gbDigit(c)))).append(digit_unit1[un1]).toString());
}
if (sb_f.length() > 0 && un1 == 0)
if (sb_f.lastIndexOf("零") == sb_f.length() - 1)
sb_f.replace(sb_f.length() - 1, sb_f.length(), digit_unit2[un2]);
else
sb_f.append(digit_unit2[un2]);
}
if (sb_f.length() == 0)
sb_f.append("零元");
if (sb_b.length() == 0)
sb_b.append("整");
return sb_f.append(sb_b).toString().replace("亿万", "亿");
}
/**
* 转换大写金额
* @param money
* @return
*/
public static String moneyGb(BigDecimal money){
if (Tools.objIsEmpty(money)){
return "";
}
return moneyGb(money.toString());
}
}