小写数字转换成大写数字

前两天看到一道题,关于小写数字转换成大写的。也就是将“1023050405”这样的数字转换为“十亿二千三百零五万零四百零五”。

这个是个算法问题,其它语言也是相通的。

  • 其中的难点应该是对零的处理。

我写的代码如下,以Java为例(因为搞安卓的嘛),这里以整型作为参数,如果你感兴趣,可以做一些改动以小数作为参数:

/**
 * @author Binzo
 * @date 20161203
 * @param number 整型参数。例如:1023050405
 * @return 根据整型参数返回大写数字。例如:十亿二千三百零五万零四百零五
 */
public static String convertToSimplifiedChinese(int number){
    final String[] TAG_DIGIT = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    final String[] TAG_WEIGHT = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "兆"};
    String numberString = String.valueOf(number);
    char[] digits = numberString.toCharArray();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < digits.length; i++) {
        // 获取每位上的数字d
        int d = Integer.valueOf(String.valueOf(digits[i]));
        String digit = TAG_DIGIT[d];
        // 反转,for循环是低位~高位,反转后即高位~低位
        int index = digits.length - i - 1;
        String weight = TAG_WEIGHT[index];
        if (DEBUG){
            System.out.printf("index=%d,", index);
            System.out.printf("digit=%s,", digit);
            System.out.printf("weight=%s\n", weight);
        }
        if (d == 0 && index % 4 == 0) {
            // 万、亿 作为一个过渡位
            sb.append(weight);
        } else if (d == 0) {
            sb.append(digit);
        } else if (d == 1 && index % 4 == 1) {
            // 类似于15,转换为"十五",而不用"一十五"
            sb.append(weight);
        } else {
            sb.append(digit);
            sb.append(weight);
        }
    }
    if (DEBUG){
        System.out.printf("%d : ", number);
        System.out.println(sb.toString());
    }
    return sb.toString();
}

在网上可以搜索到很多种版本,毕竟这是一个比较基础的算法题。
比如这篇:http://blog.csdn.net/zgrjkflmkyc/article/details/14517789
或者:https://www.oschina.net/code/snippet_137848_4896

等等,观察了一些实现方法,但最后还是自己写了一个不同的,我觉得我这个版本还是结构相对简洁些的。

一开始,自己觉得这是一个很容易实现的算法,但是真写起来也花了好一会儿时间。而后我又实现了大写中文货币格式、以及大写的美国货币格式。如下图的输出结果所示:

这里写图片描述

小写数字转换为英文大写货币形式如:
1023150405 对应:
U.S. DOLLARS ONE BILLION,TWENTY-THREE MILLION,ONE HUNDRED AND FIFTY THOUSAND,FOUR HUNDRED AND FIVE ONLY

原理还是跟我这段代码中的是相通的,只是英文的就步骤多了几个,如果你也用得上,欢迎探讨,共同学习。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值