解题思路:
- 将数据段 分为四个部分,
- getNumsEnglish 去翻译所有的三位数,最终拼接单位;
- 以下俩个main函数测试之后均可用。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
/*
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Long input = in.nextLong();
String num = String.valueOf(input);
// 定死数据为4个段
String[] str = new String[4];
int index = num.length();
int x = 3;
while (index >= 3) {
str[x] = num.substring(index - 3, index);
x--;
index -= 3;
}
if (index != 0) str[x] = num.substring(0, index);
String[] yi = new String[]{"", "thousand", "million", "billion"};
StringBuilder sb = new StringBuilder();
// 数据正写,反读,单位反安排,个千百万亿 倒着读。
for (int i = str.length - 1; i >= 0; i--) {
StringBuilder sbChild = getNumsEnglish(str[i]);
if (sbChild != null)
sb.insert(0, sbChild.append(" ").append(yi[str.length - 1 - i]).append(" "));
}
System.out.println(sb.toString());
}
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Long input = in.nextLong();
String num = String.valueOf(input);
// 最高三位 有几位数
int m = num.length() % 3;
// n + 1个三位数
int n = num.length() / 3; // =3 & m!=0 则 四个位数;
// 重置m
n = num.length() >= 3 && m == 0 ? n : n + 1;
m = num.length() >= 3 && m == 0 ? 3 : m;
String[] str = new String[n];
str[0] = num.substring(0, m);
// 大于三位数
if (n > 1 || num != "100") {
int x = m;
int i = 1;
while (x != num.length()) {
str[i] = num.substring(x, x + 3);
i++;
x += 3;
}
}
String[] yi = new String[]{"", "thousand", "million", "billion"};
StringBuilder sb = new StringBuilder();
for (int i = str.length - 1; i >= 0; i--) {
sb.insert(0, getNumsEnglish(str[i]).append(" ").append(yi[str.length - 1 - i]).append(" "));
}
System.out.println(sb.toString());
}
// 一二三
private static String[] otth = new String[] {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"
};
// 整数十位
private static String[] zhengshuShi = new String[] {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
// 翻译三位数
public static StringBuilder getNumsEnglish(String nums) {
StringBuilder sb = new StringBuilder();
if (nums == null || nums.equals("")) return sb;
int n = Integer.parseInt(nums);
int ge = n % 10;
int shi = n % 100 / 10;
int bai = n / 100;
// 1-10
if (n / 10 == 0) {
sb.append(otth[ge]);
return sb;
}
// 三位数的特殊处理
if (n / 1000 == 0 && n/100 != 0) {
// 三位数
sb.append(otth[bai]).append(" hundred");
if (shi == 0 && ge == 0) return sb;
if (shi != 0 || ge != 0) {
sb.append(" and ");
}
}
// 追加两位数
if (shi == 1) {
int geshi = n % 100;
sb.append(otth[geshi]);
} else {
if (ge == 0) sb.append(zhengshuShi[shi]);
else if( shi==0) sb.append(otth[ge]);
else sb.append(zhengshuShi[shi]).append(" ").append(otth[ge]);
}
return sb;
}
}