利用数组与map的数据结构进行中文数字与数字之间的互相转换
public class NumberUtil {
private NumberUtil() { }
private static final char[] CN_NUM = {'零', '一', '二', '三', '四','五','六','七','八','九'};
private static final char[] CN_UNIT = {' ', '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千'};
private static final String CN_NEGATIVE = "负";
private static final String CN_POINT = "点";
private static final String [] CN_UNIT_SYMBOL = {"十", "百", "千", "万","亿"};
private static Map<Character,String> NUM_MAP = null;
static {
Map<Character,String> map = new HashMap<>();
map.put('零',"0");
map.put('一',"1");
map.put('二',"2");
map.put('三',"3");
map.put('四',"4");
map.put('五',"5");
map.put('六',"6");
map.put('七',"7");
map.put('八',"8");
map.put('九',"9");
map.put('点',".");
map.put('负',"-");
NUM_MAP = map;
}
/**
* @param bigDecimalNum
* @return 中文数字
*/
public static String bigDecimalChineseNum(BigDecimal bigDecimalNum) {
if (bigDecimalNum == null) {
return "零";
}
StringBuffer sb = new StringBuffer();
//将小数点后面的零给去除
String numStr = bigDecimalNum.abs().stripTrailingZeros().toPlainString();
String[] split = numStr.split("\\.");
String integerStr = intChineseNum(Integer.parseInt(split[0]));
sb.append(integerStr);
//如果传入的数有小数,则进行切割,将整数与小数部分分离
if (split.length == 2) {
//有小数部分
sb.append(CN_POINT);
String decimalStr = split[1];
char[] chars = decimalStr.toCharArray();
for (int i = 0; i < chars.length; i++) {
sb.append(CN_NUM[Integer.parseInt(String.valueOf(chars[i]))]);
}
}
//判断传入数字为正数还是负数
int signum = bigDecimalNum.signum();
if (signum == -1) {
sb.insert(0, CN_NEGATIVE);
}
return sb.toString();
}
/** *
* int 转 中文数字
* 支持到int最大值
* @param intNum 要转换的整型数
* @return 中文数字
* */
public static String intChineseNum(int intNum ){
StringBuffer sb = new StringBuffer();
//将负数转换为正数
if (intNum < 0) {
intNum *= -1;
sb.append(CN_NEGATIVE);
}
char [] chats = (intNum + "").toCharArray();
int index = chats.length-1;
for (int i = 0; i < chats.length; i++) {
sb.append((CN_NUM[Integer.valueOf(String.valueOf(chats[i]))]+"")+CN_UNIT[index-i]);
}
return sb.toString().trim()
.replaceAll("零[千百十]", "零")
.replaceAll("零+万", "万")
.replaceAll("零+亿", "亿")
.replaceAll("亿万", "亿零")
.replaceAll("零+", "零")
.replaceAll("零$", "");
}
/**
* 中文数字 转 int
* @param num 转换的中文数字
* @return int
*/
public static int intNumber(String num){
return Integer.valueOf(core(num));
}
/**
* 中文数字 转 BigDecimal
* @param num 转换的中文数字
* @return BigDecimal
*/
public static BigDecimal bigDecimalNumber(String num){
return new BigDecimal(core(num));
}
private static String core(String num){
StringBuffer sb = new StringBuffer();
for (int i = 0; i < CN_UNIT_SYMBOL.length; i++) {
num = num.replaceAll(CN_UNIT_SYMBOL[i], "");
}
char[] chars = num.toCharArray();
for (Character aChar : chars) {
sb.append(NUM_MAP.get(aChar));
}
return sb.toString();
}
// public static void main(String[] args) {
// int num = 48616;
// String nums = "48616.33";
// String chineseNum = intChineseNum(num);
// String bigDecimalChineseNum = bigDecimalChineseNum(new BigDecimal(nums));
//
// System.out.println(chineseNum);
// System.out.println(bigDecimalChineseNum);
//
// int number = intNumber(chineseNum);
// BigDecimal bigDecimal = bigDecimalNumber(bigDecimalChineseNum);
//
// System.out.println(number);
// System.out.println(bigDecimal);
// }
}