private static final Map<Long, Character> nums = new HashMap<Long, Character>();
public static final int MAX_LENGTH = 20;
private static final String OVER_FLOW = "OVERFLOW";
static {
nums.put(0l, '零');
nums.put(1l, '壹');
nums.put(2l, '贰');
nums.put(3l, '叁');
nums.put(4l, '肆');
nums.put(5l, '伍');
nums.put(6l, '陆');
nums.put(7l, '柒');
nums.put(8l, '捌');
nums.put(9l, '玖');
nums.put(10l, '拾');
nums.put(100l, '佰');
nums.put(1000l, '仟');
nums.put(10000l, '万');
nums.put(100000000l, '亿');
nums.put(1000000000000l, '兆');
nums.put(10000000000000000l, '京');
}
/**
* 转换为中文大写数字,万亿级转换,最多可到<br/>
* 九千九百九十九京九千九百九十九兆九千九百九十九亿<br/>
* 九千九百九十九万九千九百九十九元九角九分。<br/>
* 必须是非科学计数法的数字。
*
* @param money
* @return
*/
public static String getChineseStyleMoney(double money) {
return getChineseStyleMoney(String.valueOf(money));
}
/**
* 转换为中文大写数字,万亿级转换,最多可到<br/>
* 九千九百九十九京九千九百九十九兆九千九百九十九亿<br/>
* 九千九百九十九万九千九百九十九元九角九分。<br/>
* 必须是非科学计数法的数字。
*
* @param money
* @return 中文大写数字表示的金额,如果超过额定大小,将返回<code>OVER_FLOW</code>
*/
public static String getChineseStyleMoney(String money) {
int index = money.indexOf(".");
String strNum = index > 0 ? money.substring(0, index) : money;
if (strNum.length() > MAX_LENGTH) {
return OVER_FLOW;
}
StringBuffer sb = new StringBuffer(getInteger(strNum));
if (sb.length() > 0) {
sb.append("圆");
}
if (index > 0) {
String pointNum = money.substring(index);
char c = pointNum.charAt(1);
if (c - 48 != 0) {
sb.append(nums.get(c - 48l)).append("角");
}
if (pointNum.length() >= 3) {
c = pointNum.charAt(2);
if (c - 48 != 0) {
sb.append(nums.get(c - 48l)).append("分");
}
}
} else {
if (sb.length() == 0) {
sb.append(nums.get(0l));
} else {
sb.append("整");
}
}
return sb.toString();
}
/**
* 转换整数。
*
* @return
*/
private static String getInteger(String strNum) {
int size = strNum.length() % 4 == 0 ? strNum.length() / 4 : strNum
.length() / 4 + 1;
String[] parts = new String[size == 0 ? 1 : size];
StringBuffer sb = new StringBuffer();
for (int i = 0; i < size; i++) {
int endIndex = strNum.length() - (size - i) * 4 + 4;
int startIndex = endIndex - 4 > 0 ? endIndex - 4 : 0;
parts[i] = strNum.substring(startIndex, endIndex);
int part = Integer.parseInt(parts[i]);
// @@ 如果sb长度为零表示前面还没有数字,这时如果part是零,就略过。
if (sb.length() == 0 && part == 0) {
continue;
}
// @@ 如果这部分的位数≤3,并且总位数大于0,表示前面还有数字,那么
// @@ 在这部分数字前面要加“零”,如10900,被分成两部分,“1”和“0900”,
// @@ 转换后分别是“壹万”和“玖佰”,那么应该要在这两部分之间加上一个“零”
if (part > 0 && part <= 999 && sb.length() > 0
&& sb.toString().endsWith(nums.get(0l).toString()) == false) {
sb.append(nums.get(0l));
}
sb.append(getChineseStyleInteger(part));
int powArg = (size - i) * 2 + 2;
if (part != 0) {
if (powArg >= 5 && powArg <= 7) {
sb.append(nums.get(Double.valueOf(Math.pow(10, 4))
.longValue()));
} else if (powArg >= 8 && powArg <= 9) {
sb.append(nums.get(Double.valueOf(Math.pow(10, 8))
.longValue()));
} else if (powArg >= 10 && powArg <= 11) {
sb.append(nums.get(Double.valueOf(Math.pow(10, 12))
.longValue()));
} else if (powArg >= 12 && powArg <= 13) {
sb.append(nums.get(Double.valueOf(Math.pow(10, 16))
.longValue()));
}
}
// @@ 这部分的数字以‘0’结尾,在转换后要加一个“零”。
if (parts[i].endsWith("0") && i != size - 1
&& sb.toString().endsWith(nums.get(0l).toString()) == false) {
sb.append(nums.get(0l));
}
}
return sb.toString();
}
/**
* 转换小数部分。
*
* @param sub
* @return
*/
private static String getFloat(String sub) {
StringBuffer sb = new StringBuffer();
sb.append(nums.get(0l)).append("点");
for (int i = 1; i < sub.length(); i++) {
char c = sub.charAt(i);
sb.append(nums.get(c - 48l));
}
return sb.toString();
}
Java将金额转成大写
最新推荐文章于 2023-08-05 15:35:45 发布