奇奇怪怪的算法二:将输入的数字转换为中文

我是以更加口语化的形式转换的,例如:

2  -->   二

12  -->  十二(不是一十二)

20  --->  二十

10001   --->  一万零一

100001   --->   十万零一

120023   --->   十二万零二十三

代码如下:

private static void f1() {
        Scanner scanner = new Scanner(System.in);
        long num = scanner.nextLong();
        String[] ch1 = {"零","一","二","三","四","五","六","七","八","九"};
        String[] ch2 = {"","十","百","千"};
        String[] ch3 = {"万","亿"};
        String lastResult = "";
        int index = 0;
        int time = 0;
        boolean zero = true;

        while (num != 0 && num > 0) {

            int s = (int)num%10;
            int ss = (int)num/10;
            // 这里说明是个位数。直接输出
            if(s > 0 && ss == 0){
                System.out.println(ch1[s]);
                //这里说明是 9<x<20 的两位数
            }else if(s >= 0 && ss == 1){
                // 如果是10,则直接输出 十
                if(s==0){
                    System.out.println(ch2[ss]);
                }else {
                    // 如果是大于10小于20的数,则输出 十几
                    System.out.println(ch2[ss]+ch1[s]);
                }
                // 这里处理的则是大于等于20的数
            }else {
                // 将数字转换成字符串
                String numStr = String.valueOf(num);
                List<String> list = new ArrayList<>();
                //每四位进行截取,对每一个截取出的四位数进行转换再合并
                while (numStr.length()>0) {
                    // 如果是大于四位,则截取后四位。例如1234567,先处理 4567
                    if(numStr.length()>4) {
                        list.add(numStr.substring(numStr.length()-4,numStr.length()));
                        numStr = numStr.substring(0,numStr.length()-4);
                    }else {
                        // 如果不足4位,则直接截取掉全部数据
                        list.add(numStr.substring(0,numStr.length()));
                        numStr = "";
                    }
                }
                for (int i = 0; i < list.size(); i++) {
                    String result = "";
                    String str = list.get(i);
                    int number = Integer.valueOf(str);
                    if(number < 20 && str.length() < 3) {
                        // 如果是小于20的则直接转换
                        int p = number%10;
                        int q = number/10;
                        if(p > 0 && q == 0){
                            result = ch1[p];
                        }else if(p >= 0 && q == 1) {
                            if (p == 0) {
                                result = ch2[q];
                            } else {
                                result = ch2[q] + ch1[p];
                            }
                        }
                    } else {
                            for (int j = str.length()-1; j >=0; j--) {
                                int x = Integer.valueOf(String.valueOf(str.charAt(j)));
                                // 如果为0,且是个位的,则不输出零,因为如果是10或者100等,转换汉字是没有零这个汉字的
                                if(x == 0 && result == "") {
                                    index++;
                                    continue;
                                } else {
                                    // 这种情况是处理  100001这种,十万零一,只会输出一个零
                                    if(x==0) {
                                        if(zero) {
                                            result = ch1[x] + result;
                                            zero = false;
                                        }
                                    }else {
                                        // 如果输出的不为零了,那么下一次遇到0还是需要输出
                                        result = ch1[x] + ch2[index] + result;
                                        zero = true;
                                    }
                                }
                                index++;
                            }
                        }

                    // 这里是组装 万、亿两个单位,特殊情况有  1000000000 和 100000001 ,所以特殊处理
                    if(i+1 < list.size()) {
                        if(!"".equals(result)){
                            result = ch3[time] + result;
                        } else {
                            // 如果是四个0,则result不进行任何赋值,但是因为上一步可能多赋值了一次单位,则需要进行截取掉
                            if(!lastResult.equals("")){
                                lastResult = lastResult.substring(1,lastResult.length());
                                result = ch3[time] + result;
                            }
                        }
                    } else {
                        // 如果是 100000000,因为前面的全是0,所以什么都不填,只输出最后的1再加上一个单位亿
                        if("".equals(lastResult) && list.size()>1) {
                            lastResult = ch3[time-1];
                        }
                    }
                    time++;
                    index = 0;
                    zero = true;
                    // result是每一轮四位数转换后的汉字,lastResult是最终的结果
                    lastResult = result + lastResult;
                }
                System.out.println(lastResult);
            }

            zero = true;
            time = 0;
            lastResult = "";
            index = 0;
            num = scanner.nextLong();
        }

    }

 目前只支持一万亿以下的转化。且代码中的变量名称没有按照标准命名,日后再进行优化。功能没有问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值