思路:在英语读法中3位数字看成一整体,后面再加计数单位,故实际上任何一个n都可以视为多个3位数的拼接,只需将每个3位数都转换为英文,再和million,thousand等关联词进行拼接,即可进行翻译,需要注意考虑一些特殊情况下hundred、and和空格是否存在。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
long n = sc.nextLong();
String s = String.valueOf(n);
int len = s.length();
StringBuilder res = new StringBuilder();
//根据n(0-2000000)的位数大小,分情况讨论:1-3位数,4-6位数,7-9位数
//将n按3位截断,用numberToenglish(s)方法转换成英文再和million、thousand进行拼接即得结果
if (len <= 3) {
res.append(numberToenglish(s));
} else if (len <= 6) {
res.append(numberToenglish(s.substring(0, len - 3)));
res.append(" thousand");
//如果后三位为0,则不用拼接
if (Integer.parseInt(s.substring(len - 3)) > 0) {
res.append(" ");
res.append(numberToenglish(s.substring(len - 3)));
}
} else if (len > 6) {
res.append(numberToenglish(s.substring(0, len - 6)));
res.append(" million");
//如果中三位为0,则thousand部分不用拼接
if (Integer.parseInt(s.substring(len - 6, len - 3)) > 0) {
res.append(" ");
res.append(numberToenglish(s.substring(len - 6, len - 3)));
res.append(" thousand");
}
//如果后三位为0,则不用拼接
if (Integer.parseInt(s.substring(len - 3)) > 0) {
res.append(" ");
res.append(numberToenglish(s.substring(len - 3)));
}
}
System.out.println(res.toString());
}
}
//将一个000-999的三位数字符串转换为英文
public static String numberToenglish(String s) {
HashMap<Integer, String> m = new HashMap<>();
m.put(0, "");
m.put(1, "one");
m.put(2, "two");
m.put(3, "three");
m.put(4, "four");
m.put(5, "five");
m.put(6, "six");
m.put(7, "seven");
m.put(8, "eight");
m.put(9, "nine");
m.put(10, "ten");
m.put(11, "eleven");
m.put(12, "twelve");
m.put(13, "thirteen");
m.put(14, "fourteen");
m.put(15, "fifteen");
m.put(16, "sixteen");
m.put(17, "seventeen");
m.put(18, "eighteen");
m.put(19, "nineteen");
m.put(20, "twenty");
m.put(30, "thirty");
m.put(40, "forty");
m.put(50, "fifty");
m.put(60, "sixty");
m.put(70, "seventy");
m.put(80, "eighty");
m.put(90, "ninety");
//将三位数字符串前面的0去除,避免000,001,011等情况
if (s.charAt(0) == '0') {
s = s.substring(1);
if (s.charAt(0) == '0') {
s = s.substring(1);
if (s.charAt(0) == '0') {
return "";
}
}
}
//根据该三位数字符串的位数分情况讨论
if (s.length() == 1) {
return m.get(Integer.parseInt(s));
} else if (s.length() == 2) {
//10-19有专门的英文单词,故需要单独讨论
if (s.charAt(0) == '1') {
return m.get(Integer.parseInt(s));
} else {
//得出个位数 以及 整十(不是十位数)
int single = Integer.parseInt(String.valueOf(s.charAt(1)));
int ten = Integer.parseInt(s) - Integer.parseInt(String.valueOf(s.charAt(1)));
//注意如果个位数为0,则中间空格不用拼接
if (single == 0) {
return m.get(ten);
} else {
return m.get(ten) + " " + m.get(single);
}
}
} else {
//得出百位数、个位数 以及 整十(不是十位数)
int hundred = Integer.parseInt(String.valueOf(s.charAt(0)));
int single = Integer.parseInt(String.valueOf(s.charAt(2)));
int ten = Integer.parseInt(s.substring(1)) - Integer.parseInt(String.valueOf(
s.charAt(2)));
StringBuilder sb = new StringBuilder();
sb.append(m.get(hundred) + " hundred");
if (s.charAt(1) == '1') {
sb.append(" and " + m.get(Integer.parseInt(s.substring(1))));
} else {
//根据十位数、个位数是否为0,分情况进行判断
if (s.charAt(1) != '0' || single != 0) {
sb.append(" and");
if (s.charAt(1) != '0') {
sb.append(" " + m.get(ten));
}
if (single != 0) {
sb.append(" " + m.get(single));
}
}
}
return sb.toString();
}
}
}

京公网安备 11010502036488号