题目描述:
在之前面试中,两次遇到这样的一道题目:怎么把一串数字如15521.2133
转换为一万五千五百二十一点二一三三
的形式。
思考分析:
因为我对算法的不熟练,我就从我第一印象去对这个题目做分析,尝试先做出来,未来再尝试优化。–20/10/12
首先我是先想到从字符串的角度去解决这个问题的,即对该数字串,首先先转为字符串,再进行对应的转换。
数字串形式为:xxxxx.xxxx
,那么转成字符串之后,连接整数部分与小数部分的小数点 .
就可以作为一个分割处,即将整个字符串切割为三部分:
- 左边的整数部分
- 小数点
- 右边的整数部分
那么对于这三部分就有不同的解决方案:
- 对于左边的整数部分,需要转换为
x 万 x 千 x 百 x 十 x
的形式,那么在解决这部分数字的时候,就需要对位数进行一个判断,在相应位数的数字后插入万千百十
的位数描述。 - 对于中间小数点,只需要简单转换后拼接即可。
- 对于右边的小数部分,只做简单的中文转换即可。
最后就是将三部分转换的字符进行拼接,就可以得到需要的中文字符串。
代码实现:
那么将上面的需要转化一下,基本得出,需要三个功能:
- 转化数字为中文,则需要对每个数字进行判断,然后转化
- 对位数进行判断,然后插入位数中文
- 拼接字符
一:转换数字的方法
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)