前两天看到一道题,关于小写数字转换成大写的。也就是将“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
原理还是跟我这段代码中的是相通的,只是英文的就步骤多了几个,如果你也用得上,欢迎探讨,共同学习。