• 数字转换工具


    1、如何将阿拉伯数字金额转换成中文大写金额

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * Created by IntelliJ IDEA
     * 这是一个神奇的Class,阿拉伯数字金额转换成中文大写金额
     *
     * @author zhz
     * @date 2019/10/19 17:03
     */
    public class NumberToChineseUtil {
        private static final Pattern AMOUNT_PATTERN =
                Pattern.compile("^(0|[1-9]\d{0,11})\.(\d\d)$"); // 不考虑分隔符的正确性
        private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();
        private static final String[] UNITS = {"元", "角", "分", "整"};
        private static final String[] U1 = {"", "拾", "佰", "仟"};
        private static final String[] U2 = {"", "万", "亿"};
    
        /**
         * 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式.
         * @param amount 金额数字
         * @return       中文大写
         * @throws IllegalArgumentException
         */
        public static String convert(String amount) throws IllegalArgumentException {
            // 去掉分隔符
            amount = amount.replace(",", "");
    
            // 验证金额正确性
            if (amount.equals("0.00")) {
                throw new IllegalArgumentException("金额不能为零.");
            }
            Matcher matcher = AMOUNT_PATTERN.matcher(amount);
            if (! matcher.find()) {
                throw new IllegalArgumentException("输入金额有误.");
            }
    
            String integer  = matcher.group(1); // 整数部分
            String fraction = matcher.group(2); // 小数部分
    
            String result = "";
            if (! integer.equals("0")) {
                result += integer2rmb(integer) + UNITS[0]; // 整数部分
            }
            if (fraction.equals("00")) {
                result += UNITS[3]; // 添加[整]
            } else if (fraction.startsWith("0") && integer.equals("0")) {
                result += fraction2rmb(fraction).substring(1); // 去掉分前面的[零]
            } else {
                result += fraction2rmb(fraction); // 小数部分
            }
    
            return result;
        }
    
        // 将金额小数部分转换为中文大写
        private static String fraction2rmb(String fraction) {
            char jiao = fraction.charAt(0); //
            char fen  = fraction.charAt(1); //
            return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : ""))
                    + (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");
        }
    
        // 将金额整数部分转换为中文大写
        private static String integer2rmb(String integer) {
            StringBuilder buffer = new StringBuilder();
            // 从个位数开始转换
            int i, j;
            for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {
                char n = integer.charAt(i);
                if (n == '0') {
                    // 当n是0且n的右边一位不是0时,插入[零]
                    if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {
                        buffer.append(RMB_NUMS[0]);
                    }
                    // 插入[万]或者[亿]
                    if (j % 4 == 0) {
                        if (i > 0 && integer.charAt(i - 1) != '0'
                                || i > 1 && integer.charAt(i - 2) != '0'
                                || i > 2 && integer.charAt(i - 3) != '0') {
                            buffer.append(U2[j / 4]);
                        }
                    }
                } else {
                    if (j % 4 == 0) {
                        buffer.append(U2[j / 4]);     // 插入[万]或者[亿]
                    }
                    buffer.append(U1[j % 4]);         // 插入[拾]、[佰]或[仟]
                    buffer.append(RMB_NUMS[n - '0']); // 插入数字
                }
            }
            return buffer.reverse().toString();
        }
        /**
         * 对金额的格式调整到分
         * @param money
         * @return
         */
        public static String moneyFormat(String money){//23->23.00
            StringBuffer sb=new StringBuffer();
            if(money==null){
                return "0.00";
            }
            int index=money.indexOf(".");
            if(index==-1){
                return money+".00";
            }else{
                String s0=money.substring(0,index);//整数部分
                String s1=money.substring(index+1);//小数部分
                if(s1.length()==1){//小数点后一位
                    s1=s1+"0";
                }else if(s1.length()>2){//如果超过3位小数,截取2位就可以了
                    s1=s1.substring(0,2);
                }
                sb.append(s0);
                sb.append(".");
                sb.append(s1);
            }
            return sb.toString();
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            System.out.println(NumberToChineseUtil.moneyFormat("16"));
            System.out.println(NumberToChineseUtil.convert("2.00"));
        }
    }

    结果如下:

     2、阿拉伯数字转换成中文数字

    /**
     * Created by IntelliJ IDEA
     * 这是一个神奇的Class,阿拉伯数字转换成中文数字
     *
     * @author zhz
     * @date 2019/10/19 17:13
     */
    public class NumberConventer {
        /// <summary>
        /// 阿拉伯數字轉中文
        /// </summary>
        /// <param name="intInput"></param>
        /// <returns></returns>
        public static String ToConvtZH(Integer intInput)
        {
            String sd = ToCH(intInput);
            String sd2 = sd;
            if (intInput== 10)
            {
                //sd2 = sd.insert(sd.lastIndexOf('十'), "一");
                sd2 = "十";
            }
            return sd2;
        }
    
        public static String ToCH(Integer intInput)
        {
            String si = intInput.toString();
            String sd = "";
            if (si.length() == 1)     //
            {
                sd += GetCH(intInput);
                return sd;
            }
            else if (si.length() == 2)//
            {
                if (si.substring(0, 1) == "1")
                    sd += "十";
                else
                    sd += (GetCH(intInput / 10) + "十");
                sd += ToCH(intInput % 10);
            }
            else if (si.length() == 3)//
            {
                sd += (GetCH(intInput / 100) + "百");
                if (String.valueOf(intInput % 100).length() < 2 && (intInput % 100) != 0)
                    sd += "零";
                sd += ToCH(intInput % 100);
            }
            else if (si.length() == 4)//
            {
                sd += (GetCH(intInput / 1000) + "千");
                if (String.valueOf(intInput % 1000).length() < 3 && (intInput % 1000) != 0)
                    sd += "零";
                sd += ToCH(intInput % 1000);
            }
            else if (si.length() == 5)//
            {
                sd += (GetCH(intInput / 10000) + "万");
                if (String.valueOf(intInput % 10000).length() < 4 && (intInput % 10000) != 0)
                    sd += "零";
                sd += ToCH(intInput % 10000);
            }
    
            return sd;
        }
    
        private static String GetCH(int input)
        {
            String sd = "";
            switch (input)
            {
                case 1:
                    sd = "一";
                    break;
                case 2:
                    sd = "二";
                    break;
                case 3:
                    sd = "三";
                    break;
                case 4:
                    sd = "四";
                    break;
                case 5:
                    sd = "五";
                    break;
                case 6:
                    sd = "六";
                    break;
                case 7:
                    sd = "七";
                    break;
                case 8:
                    sd = "八";
                    break;
                case 9:
                    sd = "九";
                    break;
                default:
                    break;
            }
            return sd;
        }
    
    
        /**
         * 支持到12位
         *
         * @param numberStr 中文数字
         * @return int 数字
         */
        public static int getIntegerByNumberStr(String numberStr) {
    
            // 返回结果
            int sum = 0;
    
            // null或空串直接返回
            if (numberStr == null || ("").equals(numberStr)) {
                return sum;
            }
    
            // 过亿的数字处理
            if (numberStr.indexOf("亿") > 0) {
                String currentNumberStr = numberStr.substring(0, numberStr.indexOf("亿"));
                int currentNumber = testA(currentNumberStr);
                sum += currentNumber * Math.pow(10, 8);
                numberStr = numberStr.substring(numberStr.indexOf("亿") + 1);
            }
    
            // 过万的数字处理
            if (numberStr.indexOf("万") > 0) {
                String currentNumberStr = numberStr.substring(0, numberStr.indexOf("万"));
                int currentNumber = testA(currentNumberStr);
                sum += currentNumber * Math.pow(10, 4);
                numberStr = numberStr.substring(numberStr.indexOf("万") + 1);
            }
    
            // 小于万的数字处理
            if (!("").equals(numberStr)) {
                int currentNumber = testA(numberStr);
                sum += currentNumber;
            }
    
            return sum;
        }
    
        /**
         * 把亿、万分开每4位一个单元,解析并获取到数据
         * @param testNumber
         * @return
         */
        public static int testA(String testNumber) {
            // 返回结果
            int sum = 0;
    
            // null或空串直接返回
            if(testNumber == null || ("").equals(testNumber)){
                return sum;
            }
    
            // 获取到千位数
            if (testNumber.indexOf("千") > 0) {
                String currentNumberStr = testNumber.substring(0, testNumber.indexOf("千"));
                sum += testB(currentNumberStr) * Math.pow(10, 3);
                testNumber = testNumber.substring(testNumber.indexOf("千") + 1);
            }
    
            // 获取到百位数
            if (testNumber.indexOf("百") > 0) {
                String currentNumberStr = testNumber.substring(0, testNumber.indexOf("百"));
                sum += testB(currentNumberStr) * Math.pow(10, 2);
                testNumber = testNumber.substring(testNumber.indexOf("百") + 1);
            }
    
            // 对于特殊情况处理 比如10-19是个数字,十五转化为一十五,然后再进行处理
            if (testNumber.indexOf("十") == 0) {
                testNumber = "一" + testNumber;
            }
    
            // 获取到十位数
            if (testNumber.indexOf("十") > 0) {
                String currentNumberStr = testNumber.substring(0, testNumber.indexOf("十"));
                sum += testB(currentNumberStr) * Math.pow(10, 1);
                testNumber = testNumber.substring(testNumber.indexOf("十") + 1);
            }
    
            // 获取到个位数
            if(!("").equals(testNumber)){
                sum += testB(testNumber.replaceAll("零",""));
            }
    
            return sum;
        }
    
        public static int testB(String replaceNumber) {
            switch (replaceNumber) {
                case "一":
                    return 1;
                case "二":
                    return 2;
                case "三":
                    return 3;
                case "四":
                    return 4;
                case "五":
                    return 5;
                case "六":
                    return 6;
                case "七":
                    return 7;
                case "八":
                    return 8;
                case "九":
                    return 9;
                case "零":
                    return 0;
                default:
                    return 0;
            }
        }
    
        public static void main(String[] args) {
            for (int i=0;i<50;i++){
                String _number = NumberConventer.ToConvtZH(i);
                int j = NumberConventer.getIntegerByNumberStr("一");
                System.err.println(i+"===="+_number+"----->"+"一==="+j);
            }
            Integer aa = 10;
            String _number = NumberConventer.ToConvtZH(aa);
            System.out.println(_number);
        }

    结果如下:

  • 相关阅读:
    E小press框架之第三步(参数接收)
    Express框架之第二步(路由)
    Express框架之第一步(创建工程)
    【排序】基数排序
    【数学】平方和公式$$sum_{i=1}^{n}i^2=frac{n(n+1)(2n+1)}{6}$$
    【博弈论】Nim游戏
    【搜索】对抗搜索【CF】J. Situation
    【图论】Kruskal算法
    dijkstra算法+堆优化 + 链式前向星版本
    【DP】【数位DP】
  • 原文地址:https://www.cnblogs.com/wdzhz/p/11818394.html
Copyright © 2020-2023  润新知