//num 表示数字,lower表示小写,upper表示大写
private static final String[] num_lower = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
private static final String[] num_upper = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
//unit 表示单位权值,lower表示小写,upper表示大写
private static final String[] unit_lower = { "", "十", "百", "千" };
private static final String[] unit_upper = { "", "拾", "佰", "仟"};
private static final String[] unit_common = {"","万", "亿","兆","京","垓","秭","穰","沟","涧","正","载"};
//允许的格式
private static final List promissTypes = Arrays.asList("INTEGER","INT","LONG","DECIMAL","FLOAT","DOUBLE","STRING","BYTE","TYPE","SHORT");
/**
* 数字转化为小写的汉字
*
* @param num 将要转化的数字
* @return
*/
public static String toChineseLower(Object num){
return format(num, num_lower, unit_lower);
}
/**
* 数字转化为大写的汉字
*
* @param num 将要转化的数字
* @return
*/
public static String toChineseUpper(Object num){
return format(num, num_upper, unit_upper);
}
/**
* 格式化数字
*
* @param num 原数字
* @param numArray 数字大小写数组
* @param unit 单位权值
* @return
*/
private static String format(Object num,String[] numArray,String[] unit){
if(!promissTypes.contains(num.getClass().getSimpleName().toUpperCase())){
throw new RuntimeException("不支持的格式类型");
}
//获取整数部分
String intnum = getInt(String.valueOf(num));
//获取小数部分
String decimal = getFraction(String.valueOf(num));
//格式化整数部分
String result = formatIntPart(intnum,numArray,unit);
if(!"".equals(decimal)){//小数部分不为空
//格式化小数
result += "点"+formatFractionalPart(decimal, numArray);
}
return result;
}
/**
* 格式化整数部分
*
* @param num 整数部分
* @param numArray 数字大小写数组
* @return
*/
private static String formatIntPart(String num,String[] numArray,String[] unit){
//按4位分割成不同的组(不足四位的前面补0)
Integer[] intnums = split2IntArray(num);
boolean zero = false;
StringBuffer sb = new StringBuffer();
for(int i=0;i
//格式化当前4位
String r = formatInt(intnums[i], numArray,unit);
if("".equals(r)){//
if((i+1)==intnums.length){
sb.append(numArray[0]);//结果中追加“零”
}else{
zero=true;
}
}else{//当前4位格式化结果不为空(即不为0)
if(zero || (i>0 && intnums[i]<1000)){//如果前4位为0,当前4位不为0
sb.append(numArray[0]);//结果中追加“零”
}
sb.append(r);
sb.append(unit_common[intnums.length-1-i]);//在结果中添加权值
zero=false;
}
}
return sb.toString();
}
/**
* 格式化小数部分
*
* @param decimal 小数部分
* @param numArray 数字大小写数组
* @return
*/
private static String formatFractionalPart(String decimal,String[] numArray) {
char[] val = String.valueOf(decimal).toCharArray();
int len = val.length;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
int n = Integer.valueOf(val[i] + "");
sb.append(numArray[n]);
}
return sb.toString();
}
拆分整数和小数的方法在这里: