我正在尝试更改此处的代码,因此它只适用于4位数字here
到目前为止,我的工作方式有所不同,但我无法让它完全发挥作用。
使用我现在的代码,如果我输入3
,我会得到three thousand three thousand three
如果我输入33
,我会收到three thousand three thousand thirty three
3333
给了我three hundred thirty three thousand threee hundred thirty threee thousand three hundred thirty three
有人可以帮我解决这个问题吗,如果可能的话,解释一下为什么会这样。根据我的理解它应该运作良好,显然我不太了解:D
这是代码:
private static final String[] tensNames = {
"",
" ten",
" twenty",
" thirty",
" forty",
" fifty",
" sixty",
" seventy",
" eighty",
" ninety"
};
private static final String[] numNames = {
"",
" one",
" two",
" three",
" four",
" five",
" six",
" seven",
" eight",
" nine",
" ten",
" eleven",
" twelve",
" thirteen",
" fourteen",
" fifteen",
" sixteen",
" seventeen",
" eighteen",
" nineteen"
};
private static String convertLessThanOneThousand(int number) {
String soFar;
if (number % 100 < 20){
soFar = numNames[number % 100];
number /= 100;
}
else {
soFar = numNames[number % 10];
number /= 10;
soFar = tensNames[number % 10] + soFar;
number /= 10;
}
if (number == 0) return soFar;
return numNames[number] + " hundred" + soFar;
}
public static String convert(long number) {
// 0 to 999 999 999 999
if (number == 0) { return "zero"; }
String snumber = Long.toString(number);
// pad with "0"
String mask = "000000000000";
DecimalFormat df = new DecimalFormat(mask);
snumber = df.format(number);
// nnnnnnnnnXXX
int thousands = Integer.parseInt(snumber.substring(9,12));
String tradThousands;
switch (thousands) {
case 0:
tradThousands = "";
break;
case 1 :
tradThousands = "one thousand ";
break;
default :
tradThousands = convertLessThanOneThousand(thousands)
+ " thousand ";
}
String result = tradThousands;
result = result + tradThousands;
String tradThousand;
tradThousand = convertLessThanOneThousand(thousands);
result = result + tradThousand;
// remove extra spaces!
return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " ");
}
答案 0 :(得分:1)
我已对您共享的代码进行了更改,这对我有用。
你去吧
public static String convert(long number) {
// 0 to 999 999 999 999
if (number == 0) { return "zero"; }
String snumber = Long.toString(number);
// pad with "0"
String mask = "0000";
DecimalFormat df = new DecimalFormat(mask);
snumber = df.format(number);
// nnnnnnXXXnnn
int hundredThousands = Integer.parseInt(snumber.substring(0,1));
// nnnnnnnnnXXX
int thousands = Integer.parseInt(snumber.substring(1,4));
String result = "";
String tradHundredThousands;
switch (hundredThousands) {
case 0:
tradHundredThousands = "";
break;
case 1 :
tradHundredThousands = "one thousand ";
break;
default :
tradHundredThousands = convertLessThanOneThousand(hundredThousands)
+ " thousand ";
}
result = result + tradHundredThousands;
String tradThousand;
tradThousand = convertLessThanOneThousand(thousands);
result = result + tradThousand;
// remove extra spaces!
return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " ");
}
以下是它的工作原理
public static void main(String[] args) {
System.out.println("*** 0 \t" + convert(0));
System.out.println("*** 1 \t" + convert(1));
System.out.println("*** 16 \t" + convert(16));
System.out.println("*** 100 \t" + convert(100));
System.out.println("*** 118 \t" + convert(118));
System.out.println("*** 200 \t" + convert(200));
System.out.println("*** 219 \t" + convert(219));
System.out.println("*** 800 \t" + convert(800));
System.out.println("*** 801 \t" + convert(801));
System.out.println("*** 1316 \t" + convert(1316));
System.out.println("*** 9999 \t" + convert(9999));
}
输出:
*** 0 zero
*** 1 one
*** 16 sixteen
*** 100 one hundred
*** 118 one hundred eighteen
*** 200 two hundred
*** 219 two hundred nineteen
*** 800 eight hundred
*** 801 eight hundred one
*** 1316 one thousand three hundred sixteen
*** 9999 nine thousand nine hundred ninety nine
对于超过4位的数字,您必须检查并抛出正确的异常