数字转Java

时间:2018-09-17 11:21:39

标签: java

我在编程课上有一项家庭作业,使该程序可以将数字(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;
}
}

2 个答案:

答案 0 :(得分:0)

您只需要检查switch语句的工作方式,而不使用该函数,而是将所有内容放入main函数中。 我会给你一个提示:

switch(number){
   case 1: "one"; 
   break; 

答案 1 :(得分:0)

很好,这段代码可以正常工作,但是我可以看到其中的一些问题:

  1. 字符串串联

您使用递归(即循环)。因此,每次键入str = str1 + str2时,JVM中就有三个字符串。您应该改用 StringBuilder ,最后将其转换为最终字符串。

  1. 多个数组初始化

numberToWord方法中,声明两个数组:unitsArray[]tensArray[]。每次调用此方法时,这些数组都会再次初始化。如果您使用static方法,则只需使用静态初始化块来声明这些数组一次并重用它。

  1. 关闭外部资源

Scanner scanner扫描仪应该关闭(它包含close()方法)。对于扫描程序来说,这不是很重要,但是无论如何,这是必须具备的:使用资源时,请务必在退出之前释放它。

try (Scanner scan = new Scanner(System.in)) {
    // payload
}
  1. 您会忘记最后两位数字之前的

1031 一千三十一

  1. 在代码中检查极端情况(使客户端易于使用)。

您的客户代码如下:

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()))

  1. OOP

实际上,我不介意在某些情况下使用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