问题
给定一个阿拉伯数字串,按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
注意必须严格按照规范,比如说“10010”读作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。
输入
输入描述:
有一个数字串,数值大小不超过2,000,000,000。
输入样例:
1234567009
输出
输出描述:
是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
输出样例:
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
代码
package basequestion;
import java.util.Scanner;
//* 分组,4个4个看,每四个需要加一个单位,最开始4个不需要,问题在这4个怎么解析
//* 单位不应该分成亿,万,而应该分成亿,万,千,百,十
//* 普通的4位直接一位一位解析,数是几就是几加上单位:1234——1千2百3十4
//* 特殊的,有0,数就变得特殊了。10——十,100
//* 怎么处理10读成shi而不是yi shi,还有1000怎么搞
public class Question19_Read_number {
/*思路3:直接从前往后读,一位一位地读
* 整体框架是for循环
* 里面分情况输出
* 分成两种情况:遇到0和非0
* 非0最简单,数字加单位输出,但题目对10——19有特殊要求,所以要判断,遇到时不能输出yi
* 遇到0,输出无外乎两种情况,输出0(它后面地位里边不全位0)和break结束(后面全为0)
* !错,这里想错了,还有一种情况,当0在4位的末位时,是要输出单位的
* break简单,从后往前遍历全为0则break结束
* 接下来考虑输出零地情况,如果接连几个0,就有重复输出0的情况,所以输出0考虑的就是重复输出的问题。
* 怎样避免重复输出呢,
* */
/*public class Question19_Read_number {
private static String[] s_danwei = {"","shi","bai","qian","wan","yi"};
private static String[] s_pinyin = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
private static String trans_4wei(String s) {
if(s.equals("0") || s.equals("0000"))
return "ling";
String start_string = "";
while(s.startsWith("0")) {
start_string = "ling";
s = s.substring(1, s.length());
}
String res_string = "";
char[] char_num = s.toCharArray();
int i = 0;
for(i = 0 ; i < char_num.length-1; i++) {
res_string += s_pinyin[char_num[i]-'0']+" "+s_danwei[char_num.length-i-1]+" ";
}
if(start_string.isEmpty())
res_string = res_string+s_pinyin[char_num[i]-'0'];
else
res_string = start_string + " " + res_string+s_pinyin[char_num[i]-'0'];
return res_string;
}
private static String trans_all(String s) {
//分段解析,不超过4位用封装好的函数直接解析
//不超过8位切割字符串,分两段解析
//否则分三段解析
//4位看成一段,每段都有单位,第一段的单位是亿,第二段单位是万,第三段是空
//需要注意的是如果四位数全0是不读的,即没有单位,在解析超过4位和超过8位的情况下要单独判断
if (s.length() <= 4)
return format(trans_4wei(s));
else if (s.length() <= 8) {
String s_temp1 = s.substring(0, s.length() - 4);
// !!!注意应该从后往前取4位
String s_temp2 = s.substring(s.length() - 4, s.length());
String result = format(trans_4wei(s_temp1) +
" " + s_danwei[4] + " " +
trans_4wei(s_temp2));
return result;
} else {
String s_temp1 = s.substring(0, s.length() - 8);
String s_temp2 = s.substring(s.length() - 8, s.length() - 4);
String s_temp3 = s.substring(s.length() - 4, s.length());
String result =
format(format(trans_4wei(s_temp1)) + " " + s_danwei[5] + " " +
trans_4wei(s_temp2) + " "+ s_danwei[4] + " " +
trans_4wei(s_temp3));
return result;
}
}
private static String format(String s) {
if(s.equals("ling"))
return "ling";
else if(s.equals("yi shi ling"))
return "shi";
else if(s.startsWith("yi shi"))
s = s.replaceAll("yi shi", "shi");
else{
s = s.replace("ling wan", "ling");
s = s.replace("ling bai", "ling");
s = s.replace("ling shi", "ling");
s = s.replace("ling ling", "ling");
while(s.endsWith("ling")) {
s = s.substring(0,s.length()-5);
}
if(s.endsWith(" "))
s = s.substring(0, s.length()-1);
}
return s;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
String s = String.valueOf(x);
System.out.println(trans_all(s));
}
}
经验
- ’==‘判断的是变量地址是否相等
- 比较字符串是否相等用String.equal()
- 人的视角下123456这样一个数的位是:个 十 百 千 万 十万 百万 千万 亿
而在计算机角度下数有了一种全新的构成表达形式,个 十 百 千 万 十 百 千 亿。 - 字符串的一些函数:startsWith(),endWith(),subString(start,end),replace(old,new)是真的好用!