输入数字,输出数字读法

来源:互联网 发布:软件测试难不难 编辑:程序博客网 时间:2024/05/01 02:20

思路分析



实践代码

import java.util.Arrays;import java.util.HashMap;import java.util.Map;public class Num2String {    //数字对应关系    private static Map<Integer, String> numberStringMap = new HashMap<Integer, String>();    //位数对应关系    private static Map<Integer, String> base10StringMap = new HashMap<Integer, String>();    /**     * 数字和字符串的对应关系;     */    static {        numberStringMap.put(0, "零");        numberStringMap.put(1, "壹");        numberStringMap.put(2, "贰");        numberStringMap.put(3, "叁");        numberStringMap.put(4, "肆");        numberStringMap.put(5, "伍");        numberStringMap.put(6, "陆");        numberStringMap.put(7, "柒");        numberStringMap.put(8, "捌");        numberStringMap.put(9, "玖");        base10StringMap.put(1, "");        base10StringMap.put(2, "十");        base10StringMap.put(3, "百");        base10StringMap.put(4, "千");        base10StringMap.put(5, "万");    }    /**     *  主函数,程序从这里开始执行     */    public static void main(String[] args) {        //初始化 int数组,设定有一下6个数字;        int a[] = { 2000042, 1298302000, 1003, 1030, 1000, 20000000 };        //遍历数组,输出这六个数字的读法;        for (int i = 0; i < a.length; i++) {            //输出单个数字的读法            readChinese(a[i]);        }    }    private static void readChinese(int a) {        //将数字由int 转化为  String 类型        String intString = a + "";        //将String类型 转化为 字符数组char[]        char ichar[] = intString.toCharArray();        //将字符数组 顺序颠倒 --> 比如:ichar = ['1','2','3'] ,执行revertCharArray(ichar)方法后,变为['3','2','1']        //为什么要这样做呢? --> 为了方便数字从低位开始读起;        char icharrevert[] = revertCharArray(ichar);        int i = 0;        String result = "";        //从颠倒后的数组icharrevert中读取字符,每次读取4位,如果数组长度不足4位,则读取到数组最大长度即可;        /**         * 举例说明: 如输入的数字是 200 0042;         * 顺序颠倒后,得到的字符数组icharrevert[] = ['2','4','0','0','0','0','2']         * 第一次读取4个字符,2,4,0,0         * 逆序读起,即0,0,4,2; 字符串读法为 零肆拾贰         * 第二次读取3个字符;         * 逆序读起,即2,0,0;字符串读法为贰佰,第二次读起所以,后面加一个万;最后输入读法为贰佰万;         *         * 最后输出结果为; 贰佰万零肆拾贰         */        while (i < icharrevert.length) {            //一次读取字符数组中的4个字符            char[] icharsplit = Arrays.copyOfRange(icharrevert, i, i + 4 < icharrevert.length ? i + 4                    : icharrevert.length);            //对输入的字符,转化为字符读法            result = processSplitedNumber(icharsplit, (i + 1) / 4) + result;            i = i + 4;        }        System.out.println("原数字为:"+a+"切换后的读法为:"+result);    }    //字符逆序    private static char[] revertCharArray(char[] ichar) {        char icharNew[] = new char[ichar.length];        for (int i = ichar.length - 1, j = 0; i >= 0 && j < ichar.length; i--, j++) {            icharNew[j] = ichar[i];        }        return icharNew;    }    /**     * 字符转换为字符串读法     * @param num  字符数组     * @param time 次数     * @return     */    private static String processSplitedNumber(char[] num, int time) {        StringBuffer sb = new StringBuffer();        //逆序读起        for (int i = num.length - 1; i >= 0; i--) {            //            sb.append(num[i]);            if (num[i] == '0') {                /**                 * 当前数字是0.并且是最后一位,直接不读                 */                if (i == 0) {                    continue;                }                /**                 * 当前数字是0,下一个数字不是0,补一个0上去读                 */                if (num[i - 1] != '0') {                    sb.append(numberStringMap.get(Integer.valueOf(num[i] + "")));                } else {                    continue;                }            } else {                /**                 * 如果当前位数不是0,那就正常的读出数字和位                 */                //读数字                sb.append(numberStringMap.get(Integer.valueOf(num[i] + "")));                //读位数                sb.append(base10StringMap.get(i + 1));            }        }        if (time == 0) {        } else if (time == 1) {            /**             * 每4位读一次,第二次读取完毕,后面加"万"             */            sb.append("万");        } else if (time == 2) {            /**             * 每4位读一次,第三次读取完毕,后面加"亿"             */            sb.append("亿");        }        return sb.toString();    }}



0 0