1、中文大写按“个十百千”为一个数级 2、处理0的方式:定义一个表量保存上一个字符,处理有效数字时,检查上一个字符数字,为0,补充‘零’ 3、数级处理:4位一个数级,根据数字的位置,获取到数级;定义一个标识,标识整个数级是否都是0,是则不用拼接数级,否则拼接上数级 //=========== 具体实现 =========== import java.text.DecimalFormat; public class ChineseNumber { private static final String[] NUM_DIGIT = {"", "拾", "佰", "仟"}; private static final String[] NUM_GRADE = {"", "万", "亿", "万亿", "亿亿"}; private static final char[] SYMBOL_NUMBER = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'}; private static final char DOT = '点'; public static String toChineseNumber(double number) { String numberStr = formatInput(number); String[] split = numberStr.split("\\."); char[] chars = split[0].toCharArray(); StringBuilder buf = new StringBuilder(); boolean lastZeroFlag = false; // 上一个字符是否为0 boolean gradeSkipFlag = true; // true:数级都为0 for (int i = 0; i < chars.length; i++) { int digit = chars.length - i; int grade = (digit - 1) / 4; // 数级下标 int n = char2Number(chars[i]); // 0-9 int digitFour = (digit - 1) & 3; // 个十百千 四位数位下标 if (n != 0) { // 不为0的位开始处理 if (lastZeroFlag) { buf.append(SYMBOL_NUMBER[0]); // 前一位为0,补充前一位 } buf.append(SYMBOL_NUMBER[n]); // 转大写 buf.append(NUM_DIGIT[digitFour]); // 四位数位 gradeSkipFlag = false; // 数级不都为0 } if (digitFour == 0 && !gradeSkipFlag) { // 当前数级结束,如果数级不都为0拼上数级 buf.append(NUM_GRADE[grade]); gradeSkipFlag = true; } lastZeroFlag = n == 0; } // 小数 if (split.length > 1) { buf.append(DOT); char[] dots = split[1].toCharArray(); for (char dot : dots) { int n = char2Number(dot); buf.append(SYMBOL_NUMBER[n]); } } return buf.toString(); } private static String formatInput(double number) { DecimalFormat format = new DecimalFormat("0.##########"); return format.format(number); } private static int char2Number(char c) { return c - '0'; } }
转载于:https://my.oschina.net/WXiaoqiang/blog/3059275