数字转中文大写-Java

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值