Java题:将数字字符串转为中文(未完善

题目描述:

在之前面试中,两次遇到这样的一道题目:怎么把一串数字如15521.2133转换为一万五千五百二十一点二一三三的形式。

思考分析:

因为我对算法的不熟练,我就从我第一印象去对这个题目做分析,尝试先做出来,未来再尝试优化。–20/10/12

首先我是先想到从字符串的角度去解决这个问题的,即对该数字串,首先先转为字符串,再进行对应的转换。
数字串形式为:xxxxx.xxxx,那么转成字符串之后,连接整数部分与小数部分的小数点 . 就可以作为一个分割处,即将整个字符串切割为三部分:

  1. 左边的整数部分
  2. 小数点
  3. 右边的整数部分

那么对于这三部分就有不同的解决方案:

  1. 对于左边的整数部分,需要转换为x 万 x 千 x 百 x 十 x的形式,那么在解决这部分数字的时候,就需要对位数进行一个判断,在相应位数的数字后插入 万千百十 的位数描述。
  2. 对于中间小数点,只需要简单转换后拼接即可。
  3. 对于右边的小数部分,只做简单的中文转换即可。

最后就是将三部分转换的字符进行拼接,就可以得到需要的中文字符串。

代码实现:

那么将上面的需要转化一下,基本得出,需要三个功能:

  1. 转化数字为中文,则需要对每个数字进行判断,然后转化
  2. 对位数进行判断,然后插入位数中文
  3. 拼接字符

一:转换数字的方法

    public static String numToCn(String num) {
        String[] nums = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
        return nums[Integer.parseInt(num)];
    }

二:对位数进行判断插入位数字的方法

    public StringBuffer leftNumToCn(String leftNum) {
        String[] num = new String[leftNum.length()];
        for (int i = 0; i < leftNum.length(); i++) {
            num[i] = String.valueOf(leftNum.charAt(i));
        }
        //位数标识
        int flag = num.length;
        StringBuffer nums = new StringBuffer();
        if (flag >= 5) {
            nums.append(numToCn(num[flag - 5]));
            nums.append("万");
        }
        if (flag >= 4) {
            nums.append(numToCn(num[flag - 4]));
            nums.append("千");
        }
        if (flag >= 3) {
            nums.append(numToCn(num[flag - 3]));
            nums.append("百");
        }
        if (flag >= 2) {
            nums.append(numToCn(num[flag - 2]));
            nums.append("十");
        }
        if (flag >= 1) {
            nums.append(numToCn(num[flag - 1]));
        }
        return nums;
    }

三:字符拼接的方法

    public String toChinese(Object n) {
        String changeNum = String.valueOf(n);
        String[] strings = changeNum.split("\\.");
        return leftNumToCn(strings[0]) + "点" + rightNum(strings[1]);
    }


    public StringBuffer rightNum(String rightNum) {
        StringBuffer nums = new StringBuffer();
        for (int i = 0; i < rightNum.length(); i++) {
            nums.append(numToCn(String.valueOf(rightNum.charAt(i))));
        }
        return nums;
    }

测试代码:


public class NumsToChinese {
    public static void main(String[] args) {
        //将21351.1243这种格式转为中文,前面整数考虑到万位
        /**
         * 思路:
         * 以小数点为界,左边为整数部分,需要转为格式二万一千三百五十一,右边部分为一二四三
         *  最后结果为 二万一千三百五十一点一二四三
         *
         */

        Double num = 14124.1234;

        System.out.println(new NumsToChinese().toChinese(num));

    }

问题总结:

目前算是基本将该题目实现,但是在拓展性上,效率上,可读性上,还需要更多的改进,未来还需要改进,今日先写出来,不然以后可能就不会写了。(2020/10/12)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值