我在编程课上有一项家庭作业,使该程序可以将数字(Integer
)更改为单词(String
)。
我们只能使用If else或Switch
语句,并且我的代码已经可以使用,但是我的老师说我的代码不正确,因为我使用了private static String numberToWord(int number)
和String unitsArray[]
,他说我只能使用我们在课堂上讨论的事情,所以我需要重构我的代码。
请帮助我重构代码。我现在很困惑,无法正常思考。
这是我在Java中的代码:
public static void main(String[] args) {
int number = 0;
Scanner scanner = new Scanner(System.in);
System.out.print("Please type a number(max upto 9 digits)");
// read the number
number = scanner.nextInt();
if (number == 0) {
System.out.print("Number in words: Zero");
} else {
System.out.print(numberToWord(number));
}
}
private static String numberToWord(int number) {
// variable to hold string representation of number
String words = "";
String unitsArray[] = { "zero", "one", "two", "three", "four", "five", "six",
"seven", "eight", "nine", "ten", "eleven", "twelve",
"thirteen", "fourteen", "fifteen", "sixteen", "seventeen",
"eighteen", "nineteen" };
String tensArray[] = { "zero", "ten", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety" };
if (number == 0) {
return "zero";
}
// add minus before conversion if the number is less than 0
if (number < 0) {
// convert the number to a string
String numberStr = "" + number;
// remove minus before the number
numberStr = numberStr.substring(1);
// add minus before the number and convert the rest of number
return "minus " + numberToWord(Integer.parseInt(numberStr));
}
// check if number is divisible by 1 million
if ((number / 1000000) > 0) {
words += numberToWord(number / 1000000) + " million ";
number %= 1000000;
}
// check if number is divisible by 1 thousand
if ((number / 1000) > 0) {
words += numberToWord(number / 1000) + " thousand ";
number %= 1000;
}
// check if number is divisible by 1 hundred
if ((number / 100) > 0) {
words += numberToWord(number / 100) + " hundred ";
number %= 100;
}
if (number > 0) {
// check if number is within teens
if (number < 20) {
// fetch the appropriate value from unit array
words += unitsArray[number];
} else {
// fetch the appropriate value from tens array
words += tensArray[number / 10];
if ((number % 10) > 0) {
words += "-" + unitsArray[number % 10];
}
}
}
return words;
}
}
答案 0 :(得分:0)
您只需要检查switch语句的工作方式,而不使用该函数,而是将所有内容放入main函数中。 我会给你一个提示:
switch(number){
case 1: "one";
break;
答案 1 :(得分:0)
很好,这段代码可以正常工作,但是我可以看到其中的一些问题:
您使用递归(即循环)。因此,每次键入str = str1 + str2
时,JVM中就有三个字符串。您应该改用 StringBuilder ,最后将其转换为最终字符串。
在numberToWord
方法中,声明两个数组:unitsArray[]
和tensArray[]
。每次调用此方法时,这些数组都会再次初始化。如果您使用static
方法,则只需使用静态初始化块来声明这些数组一次并重用它。
Scanner scanner
扫描仪应该关闭(它包含close()
方法)。对于扫描程序来说,这不是很重要,但是无论如何,这是必须具备的:使用资源时,请务必在退出之前释放它。
try (Scanner scan = new Scanner(System.in)) {
// payload
}
1031 是一千和三十一
您的客户代码如下:
number = scanner.nextInt();
if (number == 0)
System.out.print("Number in words: Zero");
else
System.out.print(numberToWord(number));
这是非常糟糕的做法。此检查应封装在您的逻辑中。客户不必担心极端情况:System.out.print(numberToWord(scanner.nextInt()))
。
实际上,我不介意在某些情况下使用static
。但是在给定的示例中,您的老师是对的:您有一个任务convert number to the string representation
,并且该任务包含一些逻辑和内部常量。最好将其封装到单独的类中。可能是只有一个公共方法static
的{{1}}类(但这是旧样式,而不是OOP)。您可以创建单独的类,将静态方法移至其中,然后删除String convert(long val)
。这就足够了(再加上我将在构造函数中初始化一次数组)。一般来说,这就足够了。
P.S。 我能给你我解决这个问题的方法吗?我将该任务分为两个步骤:首先-将字符串转换为简单数字列表(例如 1、10,一百,百万),然后使用预定义的字典将这些简单数字转换为最终字符串。 / p>
例如
值:static
数字:1001
结果:[1, 1000, 1]
我的解决方案:
one thousand and one