JAVA实现数字转换汉字显示---(用心制作的工具)

写在前面:(好久没有写博客了)

我为什么要写这个工具呢?网上搜了一些相关的文章,发现他们写的工具很简单,就是一一对应的替换,比如”231“就变成”二百三十一“,”1003“就变成”一千三“, what??? 1003 ==》 一千三  ==> 1300 ?????????????????????????????

 

于是我就觉得,干脆自己写一个好的,然后分享出来给大家:代码如下:

-----------------------------------------------------------------------------------------------------------------------------

private static String[] NUMBER_ZH = new String[]{"零","一","二","三","四","五","六","七","八","九","十"};
//最大支持9千兆
private static String[] NUMBER_UNIT = new String[]{"","十","百","千","万","十","百","千","亿","十","百","千","兆","十","百","千"};

/**
 * @param number
 * @return
 */
public static String digital2Chinese(long number){
    Long value = number;
    Boolean isNegative = false;
    if (value < 0){
        value = -value;
        isNegative= true;
    }
    BigDecimal bigDecimal = BigDecimal.valueOf(value);

    String valueStr = value.toString();

    Integer [] digits = new Integer[valueStr.length()];

    for (int i=0;i<valueStr.length();i++){ //循环数存储每一位数字,从低到高
        digits[i] = bigDecimal.divideAndRemainder(BigDecimal.valueOf(10))[1].intValue();  //value.intValue()%10;
        bigDecimal = bigDecimal.divide(BigDecimal.valueOf(10));
    }
    StringBuilder sb = new StringBuilder();

    CollectionUtils.reverseArray(digits);  // 从高到低

    Boolean flush = false;
    Boolean needFilling = true;

    if (digits.length > 16){
        throw new ArrayIndexOutOfBoundsException("数字太大了,超出汉字可读范围");
    }

    for (int i=0;i<digits.length;i++){
        if (digits[i].equals(0)){
            if (needFilling){
                if ( digits.length-i-1  == 4){
                    sb.append("万");
                    needFilling = false;
                }
                if ( digits.length-i-1 == 8){
                    sb.append("亿");
                    needFilling = false;
                }
                if ( digits.length-i-1 == 12){
                    sb.append("兆");
                    needFilling = false;
                }
            }

            flush = true;
            continue;
        }
        if (flush){
            sb.append("零");
            flush = false;
        }
        sb.append( NUMBER_ZH[ digits[i] ] ).append( NUMBER_UNIT[digits.length-i-1] );
        if (Arrays.asList(4,8,12).contains( digits.length-i-1 )){
            needFilling = false;
        }else{
            needFilling = true;
        }
    }

    if (isNegative){
        return "负"+sb.toString();
    }
    return sb.toString();
}

-------------------------------------------------------------------------------------------------------------------------------------------------

 

下面是我的效果演示,翻译成 ”准确的“汉语!!!

 

 

如果有疑问欢迎留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值