java,转人民币大写,工具类
完整工具类如下:
package com.example.demo.utils;
import java.math.BigDecimal;
public class Decimal2CnUtil {
private static final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private static final String[] UPPER_MONETARY_UNIT = {"", "拾", "佰", "仟"};
private static final String CN_FULL = "整";
private static final String CN_NEGATIVE = "负";
private static final String ZERO_NUM = "零";
private static final int MONEY_PRECISION = 2;
private static final String CN_ZERO_FULL = "零元" + CN_FULL;
public static String number2CNMonetaryUnit(BigDecimal numberOfMoney) {
StringBuilder sb = new StringBuilder();
// -1, 0, or 1 as the value of this BigDecimal is negative, zero, or positive.
int signNum = numberOfMoney.signum();
// 零元整的情况
if (signNum == 0) {
return CN_ZERO_FULL;
}
// 这里会进行金额的四舍五入
long number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0, 4).abs().longValue();
// 得到小数点后两位值
long scale = number % 100;
String sc = changeScale2String(scale);
number = (number / 100);
long first4Pos = number % 10000L;
String fir4Pos = change4Pos2String(first4Pos);
number = number / 10000;
long second4Pos = number% 10000L;
String sec4Pos = change4Pos2String(second4Pos);
number = number / 10000;
long third4Pos = number % 10000L;
String thi4Pos = change4Pos2String(third4Pos);
number = number / 10000;
long four4Pos = number % 10000L;
String fo4Pos = change4Pos2String(four4Pos);
if(fo4Pos.length() > 1){
sb.append(fo4Pos).append("萬");
}
if(thi4Pos.length() > 1){
sb.append(thi4Pos).append("億");
}
if(sec4Pos.length() > 1){
sb.append(sec4Pos).append("萬");
}
if(fir4Pos.length() > 1){
sb.append(fir4Pos).append("圆");
}
sb.append(sc);
String result = removeLeftZero(sb.toString());
if(signNum < 0){
return CN_NEGATIVE + result;
}
return result;
}
private static String change4Pos2String(long num){
if(num == 0){
return ZERO_NUM;
}
StringBuilder sb = new StringBuilder();
int time = 3;
int init = 1000;
long val = num / init;
while(time >= 0){
num = num % init;
if(val == 0){
if(!sb.toString().endsWith(ZERO_NUM)){
sb.append(ZERO_NUM);
}
}else{
sb.append(CN_UPPER_NUMBER[(int) val]).append(UPPER_MONETARY_UNIT[time]);
}
init = init / 10;
if(init != 0){
val = num / init;
}
time--;
}
return removeRightZero(sb.toString());
}
private static String changeScale2String(long scale){
if(scale == 0){
return "整";
}else if(scale % 10 == 0){
return CN_UPPER_NUMBER[(int)scale/10] + "角";
}else{
return CN_UPPER_NUMBER[(int)scale/10] + "角" + CN_UPPER_NUMBER[(int)scale % 10] + "分";
}
}
private static String removeLeftZero(String sb){
while(sb.startsWith(ZERO_NUM)){
sb = sb.substring(1);
}
return sb;
}
private static String removeRightZero(String sb){
while(sb.endsWith(ZERO_NUM)){
sb = sb.substring(0, sb.length() - 1);
}
return sb;
}
public static void main(String[] args) {
// String je ="4302085.7";
// String je ="1,3120,0021,0003.45";
String je ="1312000210003.45";
BigDecimal numberOfMoney = new BigDecimal(je);
String s = Decimal2CnUtil.number2CNMonetaryUnit(numberOfMoney);
System.out.println(s);
}
}



