java 金额数字转换大写算法

Posted ibigboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 金额数字转换大写算法相关的知识,希望对你有一定的参考价值。

根据人民币大写金额规范,转换有几点要注意的:

阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖圆伍角。
阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6,007.14,应写成人民币陆仟零柒圆壹角肆分。
阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但仟位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1,680.32,应写成人民币壹仟陆佰>捌拾元零三角贰分,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟圆伍角叁分。
阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾圆零肆分。
大写金额到“元”为止的,在“元”之后应写上“整”或“正”字,在“角”之后可以不写“整”或“正”字,在“分”之后的不写”整“或”正“字。

基本思路,每4个一组,表示千、百、拾,然后加上亿、万、圆,这样的,如果有重复的0,需要忽略

public class MoneyToChiness
    public static void main(String[] args) 
        long l = System.currentTimeMillis();
        System.out.println(MoneyToChiness.moneyToChinese(new BigDecimal("999999999999.99")));
        System.out.println(System.currentTimeMillis()-l);
    
    public static String moneyToChinese(BigDecimal i_money) 
        if(i_money.equals(BigDecimal.ZERO))
            return "零圆整";
        
        Double max = 1000000000000D;
        Double min = 0.01D;
        if (i_money.doubleValue() >= max  || i_money.doubleValue() < min) 
            return "大于1万亿或小于1分了";
        
        i_money = i_money.setScale(2, RoundingMode.HALF_UP);
        String numStr = i_money.toString();
        int pointPos = numStr.indexOf('.');
        //整数部分
        String s_int = null;
        //小数部分
        String s_point = null;
        if (pointPos >= 0) 
            s_int = numStr.substring(0, pointPos);
            s_point = numStr.substring(pointPos + 1);
         else 
            s_int = numStr;
        
        StringBuilder sb = new StringBuilder();
        if(!"0".equals(s_int))
            int groupCount = (int) Math.ceil(s_int.length() / 4.0);
            for (int group = 0; group < groupCount; group++) 
                boolean zeroFlag = true;
                boolean noZeroFlag = false;
                int start = (s_int.length() % 4 == 0 ? 0 : (s_int.length() % 4 - 4)) + 4 * group;
                for (int i = 0; i < 4; i++) 
                    if (i + start >= 0) 
                        int value = s_int.charAt(i + start) - '0';
                        if (value > 0) 
                            sb.append(CN_UPPER_NUMBER[value]);
                            if (i < 3) 
                                sb.append(CN_UPPER_UNIT[i]);
                            
                            zeroFlag = true;
                            noZeroFlag = true;
                         else if (zeroFlag) 
                            sb.append('零');
                            zeroFlag = false;
                        
                    
                
                if(sb.charAt(sb.length() - 1) == '零')
                    sb.deleteCharAt(sb.length() - 1);
                
                if(noZeroFlag || groupCount - group == 1)
                    sb.append(CN_GROUP[groupCount - group - 1]);
                
            
        
        if (s_point == null || "00".equals(s_point)) 
            sb.append('整');
        else
            int j = s_point.charAt(0) - '0';
            int f = s_point.charAt(1) - '0';
            if(j > 0)
                sb.append(CN_UPPER_NUMBER[j]).append('角');
                if(f != 0)
                    sb.append(CN_UPPER_NUMBER[f]).append('分');
                
            else if("0".equals(s_int))
                sb.append(CN_UPPER_NUMBER[f]).append('分');
            else 
                sb.append('零').append(CN_UPPER_NUMBER[f]).append('分');
            
        
        return sb.toString();
    


    private static final char[] CN_UPPER_NUMBER = "零壹贰叁肆伍陆柒捌玖".toCharArray();
    private static final char[] CN_UPPER_UNIT = "仟佰拾".toCharArray();
    private static final char[] CN_GROUP = "圆万亿".toCharArray();

执行三次耗时分别为,6毫秒,5毫秒,6毫秒,平均5.67毫秒。在我电脑CPU90%的情况下测得。

转自https://www.cnblogs.com/xcr1234/p/9140867.html

以上是关于java 金额数字转换大写算法的主要内容,如果未能解决你的问题,请参考以下文章

java实现数字金额转换成汉字大写金额

Java中金额数字转换为大写数字

Java 关于中文大写金额与阿拉伯数字 互相转换的问题(eclipse版)

Java将控制台输入的人民币数字金额转化为大写

java阿拉伯数字表示的金额转换成中文大写金额

PHP数字金额转换大写金额