zoukankan      html  css  js  c++  java
  • 算法--java实现将数字转换成人民币大写(迅雷面试题)

    今天去迅雷面试,是个数字转换成人民币的算法题:

    public class Rmb {
        /**
         * 人民币的基本信息和操作
         *
         * @author soyoungboy
         * @version 1.0
         */
        private double number;     //人民币的数量
        private static final String[] hanArr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};//汉字计数符号
        private static final String[] unitArr = {"", "拾", "佰", "仟"};//汉字计数单位
        private static final String[] unitArrs = {"万", "亿", "万", "兆", "万", "亿", "万", "圆"}; //顺序添加单位
    
        //private String[] unitsArr = {"万", "亿"}; //汉字计数大单位
        public Rmb() {
        }
    
        /**
         * 构造器初始化人民币数量
         *
         * @param number 给定的初始化人民币数
         */
        private Rmb(double number) {
            this.number = number;
        }
    
        /**
         * 把一个浮点数分解成long型部分和小数部分字符串,把人民币换成了整数,浮点数在取小数部分时临界值有误差
         *
         * @return 返回分解后的字符串数组,第一个数组元素是整数部分,第二个是小数部分字符串
         */
        private String[] divideNum() {
            double num = Math.round(number * 100);//对number进行四舍五入取整
            long integerPart = (long) num; //连同小数点后两位取成整数 ,避免使用减法
            //double decimalsPart = num-integerPart;//小数部分,临界时产生了误差
            String decimalsPartStr;
            long b = integerPart % 10; //小数点后第二位
            long a = (integerPart / 10) % 10;//小数点后第一位
            integerPart /= 100;
            if (a == 0 && b == 0) {
                decimalsPartStr = null;
            } else {
                decimalsPartStr = "" + a + b;
            }
            return new String[]{String.valueOf(integerPart), decimalsPartStr};
        }
    
        /**
         * 把一个数字字符转换成汉语的人民币读法
         *
         * @return 返回汉语人民币读法的字符串形式
         */
        private String toHanStr() {
            String[] results = new String[9]; //用来暂时存储每四位分段后的数字字符串
            String[] resultStrs = new String[9];//用来暂时存储每四位分段后转换成的人民币读法
            StringBuilder result = new StringBuilder();//最终的转换结果
            String[] divideStr = divideNum(); //得到浮点数分解成的long型部分和小数部分字符串,第一个数组元素是整数部分字符串,第二个是小数部分字符串
            results[8] = divideStr[1];
            for (int i = divideStr[0].length(), j = 8; i > 0 && j > 0; i -= 4, j--) {
                try {
                    results[j - 1] = divideStr[0].substring(i - 4, i);
                } catch (Exception e) {
                    results[j - 1] = divideStr[0].substring(0, i);
                    break;
                }
            }
            if (results[8] == null) {
                resultStrs[8] = "整";
            } else if (results[8].charAt(1) == '0') {
                resultStrs[8] = hanArr[results[8].charAt(0) - 48] + "角"; //根据ASCII码和hanArr数组吧数字改成汉语大写
            } else {
                resultStrs[8] = hanArr[results[8].charAt(0) - 48] + "角" + hanArr[results[8].charAt(1) - 48] + "分";
            }
            for (int i = 0; i < 8; i++) {
                if (results[i] != null) {
                    resultStrs[i] = "";
                    resultStrs[i] += hanArr[results[i].charAt(0) - 48] + unitArr[results[i].length() - 1]; //根据ASCII码和数组长度选择数的单位
                    for (int j = 1; j < results[i].length(); j++)
                        if (results[i].charAt(j - 1) == '0' && results[i].charAt(j) != '0')
                            resultStrs[i] += "零" + hanArr[results[i].charAt(j) - 48] + unitArr[results[i].length() - 1 - j];  //根据ASCII码和数组长度选择数的单位
                        else if (results[i].charAt(j) != '0')
                            resultStrs[i] += hanArr[results[i].charAt(j) - 48] + unitArr[results[i].length() - 1 - j];
                }
            }
            for (int i = 0; i < 8; i++) {
                if (resultStrs[i] != null) {
                    result.append(resultStrs[i]).append(unitArrs[i]);
                }
            }
            result.append(resultStrs[8]);
            return result.toString();
        }
    
        public static void main(String[] args) {
            double l;
            byte[] bye = new byte[50];
            System.out.println("请输入要转换的人民币数量:");
            try {
                System.in.read(bye);
            } catch (Exception e) {
                e.printStackTrace();
            }
            String s = new String(bye);
            l = Double.parseDouble(s);
            Rmb r = new Rmb(l);
            s = r.toHanStr();
            System.out.println(s);
    
        }
    }

    结果:

    请输入要转换的人民币数量:
    456789
    肆拾伍万陆仟柒佰捌拾玖圆整

    后悔没坚持参加面试。

    如果code代码出处:https://www.teakki.com/p/57df787e1201d4c1629ba891

  • 相关阅读:
    从Python到Web开发
    源码安装缺少configure文件
    5
    4
    3
    2
    42
    1
    18
    41
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/7056832.html
Copyright © 2011-2022 走看看