zoukankan      html  css  js  c++  java
  • 将一个浮点数转化为人民币大写字符串

    package com.itwang;
    
    import java.util.Arrays;
    
    /**
     * 浮点数转为人民币
     */
    public class NumberConventor {
        private String[] hanArr = {"零", "壹", "贰", "弎", "肆", "伍", "陆", "柒", "捌", "玖"};
        private String[] unitArr = {"分","角","十", "百", "千","万","亿"};
        /**
         * 把一个浮点数分解成整数部分和小数部分
         *
         * @param num
         * @return
         */
        private String[] divide(double num) {
            //将一个浮点数强制转换为long型,即得到它的整数部分
            long zheng = (long) num;
            //浮点数减去整数得到小数部分,小数部分乘以100后再取整得到2为小数
            long xiaoshu = Math.round((num - zheng) * 100);
            return new String[]{zheng + "", String.valueOf(xiaoshu)};
        }
    
        /**
         * 将后面的两位小数转化为汉字
         * @return
         */
        private String douleToString(String numStr){
            String result = "";
            int numLen = numStr.length();
            if (numStr.charAt(0) == '0' && numLen == 1){
                return "";
            }
            for (int i = 0;i < numLen;i++){
                int num = numStr.charAt(i) - 48;
                result += hanArr[num] + unitArr[1 - i];
            }
            return result;
        }
        /**
         * 把一个四位的数变成汉字字符串
         */
        private String toHanStr(String numStr) {
            String result = "";//存放最终结果
            int numLen = numStr.length();
            //扫描数字串从第一个不为零的地方开始
            int j;
            for (j = 0; j < numLen; j++) {
                if (numStr.charAt(j) != '0') {
                    break;
                }
            }
            //四个全是零
            if (j == numLen) {
                return hanArr[0];
            }
            //不是四个全是零
            //从第一个不等于零的地方依次遍历数字字符串的每一位数字
            for (int i = j; i < numLen; i++) {
                //把char型数字换成int型数字,因为它们的ASCII码值恰好相差48
                //因此把char型数字减去48得到int型数字
                int num = numStr.charAt(i) - 48;
                //如果不是最后一位数字,而且数字不是零,需添加单位(千,百,十)
                if (num != 0 && i != numLen - 1) {
                    result += hanArr[num] + unitArr[numLen - i];
                } else {
                    //否则是最后一位则不添加单位,如果最后一位是零,连续两个零
                    if (i == numLen - 1 && num == 0) {
                        return result;
                    }
                    //判断当前位置如果为零,判断下一个位置如果仍然为零直接跳过这两个零
                    if(i != numLen - 1 && (i + 1) != numLen && (numStr.charAt(i + 1) == '0')){
                        i++;
                    }
                    else {
                        result += hanArr[num];
                    }
                }
            }
            return result;
        }
    
        /**
         * 从四位数字串扩展到12位
         * @param numStr
         */
        private String toRBM(double inputNum){
            String numStr = divide(inputNum)[0];
            String numStr2 = divide(inputNum)[1];
            //换算整数部分
            int numLen = numStr.length();
            int entirePart = numLen / 4;
            int yuPart = numLen % 4;
            String result = "";
            //四位数字或四位数字之内
            if (numLen <= 4){
                result += toHanStr(numStr);
            }
            if (numLen > 4 && numLen <= 8){
                //获取最高位的4位数字串
                String gaowei = numStr.substring(0,numLen - 4);
                //获取最低位的4位数字串
                String disiwei = numStr.substring(numLen - 4);
                result += toHanStr(gaowei) + unitArr[5];
                result += toHanStr(disiwei);
            }
            if (numLen > 8 && numLen <= 12){
                //获取最高位的4位数字串
                String gaowei = numStr.substring(0, numLen - 8);
                //获取中间位的4位数字串
                String midlewei = numStr.substring(numLen - 8, numLen - 4);
                //获取最低位的4位数字串
                String disiwei = numStr.substring(numLen - 4);
                result += toHanStr(gaowei) + unitArr[6];
                result += toHanStr(midlewei) + unitArr[5];
                result += toHanStr(disiwei);
            }
            if (numLen > 12){
                return "输入的长度有误!";
            }
            //换算小数部分
            result += douleToString(numStr2);
            return result;
        }
        public static void main(String[] args) {
            NumberConventor numberConventor = new NumberConventor();
            //numberConventor.divide(2346844.123)[0]
            double inputNum = 123456789354.123;
            System.out.println(numberConventor.toRBM(inputNum));
        }
    }

    运行结果:

  • 相关阅读:
    uvm_misc——杂货铺(miscellaneous)
    23种设计模式及其应用场景
    Hadoop TextInputFormat源码分析
    java字符串替换函数高效实现
    hadoop HA 之 QJM
    中文分词词性对照表
    计算两个字符串编辑距离
    java 图片处理
    zookeeper数据迁移
    正则表达式
  • 原文地址:https://www.cnblogs.com/ya-qiang/p/9438661.html
Copyright © 2011-2022 走看看