Java 如何将100转换成1 0而不是1?

Java 如何将100转换成1 0而不是1?,java,Java,我必须调用一个将数字转换为单词的方法和另外两个方法,这两个方法是反转和获取输入数字的计数,并且必须在第一个方法中调用这两个方法,但在数字100的情况下,它给出的输出是1,但它应该给出一个零。因此,我的困惑是如何在转换数字方法时调用计数方法和通过简单的调用将give输出设为一个零零,因为我使用的是intelliJ,而且是一个初学者,所以我必须了解如何在第一个方法中调用get count方法,即从数字到单词 public static void numberToWords(int number) {

我必须调用一个将数字转换为单词的方法和另外两个方法,这两个方法是反转和获取输入数字的计数,并且必须在第一个方法中调用这两个方法,但在数字100的情况下,它给出的输出是1,但它应该给出一个零。因此,我的困惑是如何在转换数字方法时调用计数方法和通过简单的调用将give输出设为一个零零,因为我使用的是intelliJ,而且是一个初学者,所以我必须了解如何在第一个方法中调用get count方法,即从数字到单词

public static void numberToWords(int number) {
    if (number == 0) {
        System.out.println("Zero");
    } else if (number < 0) {
        System.out.println("Invalid Value");
    }

    int revInteger = reverse(number);
    while (revInteger != 0) {
        int modulus = revInteger % 10;
        revInteger /= 10;

        switch (modulus) {

            case 1:
                System.out.println("One");
                break;

            case 2:
                System.out.println("Two");
                break;

            case 3:
                System.out.println("Three");
                break;

            case 4:
                System.out.println("Four");
                break;

            case 5:
                System.out.println("Five");
                break;

            case 6:
                System.out.println("Six");
                break;

            case 7:
                System.out.println("Seven");
                break;

            case 8:
                System.out.println("Eight");
                break;

            case 9:
                System.out.println("Nine");
                break;

            default:
                break;
        }
    }
}


public static int reverse(int reversedNumber) {
    int revNumber = reversedNumber;
    int digit = 0;
    while (revNumber != 0) {
        int n = revNumber % 10;
        digit = digit * 10 + n;
        revNumber /= 10;
    }
    return digit;
}

public static int getDigitCount(int number) {
    int count = 0;
    if (number > 0) {
        while (number != 0) {
            number /= 10;
            ++count;
        }
        return count;
    } else if (number == 0) {
        return 1;
    }
    return -1;
}
publicstaticvoidnumbertowords(整数){
如果(数字==0){
System.out.println(“零”);
}否则如果(数字<0){
System.out.println(“无效值”);
}
int revInteger=反向(数字);
while(修订者!=0){
int模数=修订者%10;
修订者/=10;
开关(模数){
案例1:
系统输出打印项次(“一”);
打破
案例2:
System.out.println(“两个”);
打破
案例3:
System.out.println(“三”);
打破
案例4:
系统输出打印号(“四”);
打破
案例5:
系统输出打印号(“五”);
打破
案例6:
系统输出打印号(“六”);
打破
案例7:
系统输出打印号(“七”);
打破
案例8:
系统输出打印号(“八”);
打破
案例9:
系统输出打印号(“九”);
打破
违约:
打破
}
}
}
公共静态int reverse(int reversedNumber){
int revNumber=反向编号;
整数位数=0;
while(revNumber!=0){
int n=revNumber%10;
数字=数字*10+n;
revNumber/=10;
}
返回数字;
}
公共静态整数getDigitCount(整数){
整数计数=0;
如果(数字>0){
while(数字!=0){
数目/=10;
++计数;
}
返回计数;
}else if(数字==0){
返回1;
}
返回-1;
}

您可以使用预先构建的地图,将数字替换为单词,如下图所示

public class NumToWord {

    public static void main(String[] args) {
        numberToWords(100);
    }

    public static final String[] numToWord = new String[10];
    static {
        numToWord[0]="Zero";
        numToWord[1]="One";
        numToWord[2]="Two";
        numToWord[3]="Three";
        numToWord[4]="Four";
        numToWord[5]="Five";
        numToWord[6]="Six";
        numToWord[7]="Seven";
        numToWord[8]="Eight";
        numToWord[9]="Nine";
    }
    public static void numberToWords(int number) {
        String numberStr = number + "";
        for (char a: numberStr.toCharArray()) {
            String word = numToWord[Integer.parseInt(a+"")];
            if(null!=word) {
                System.out.println(word);
            }
        }
    }
}



问题是100的倒数是001,也就是1。然而,有一个技巧你可以拉,你附加1(通过数字*10+1)的数字之前,扭转它,然后终止时,剩下的数字是1(当然你可以附加任何非零数字,但1是一样好的任何)。例如,在200的情况下,你可以反转2001,也就是1002。当你输出了二零零,剩下的是1,所以终止

int revInteger = reverse(number * 10 + 1);
while (revInteger != 1) {...}
但是,您还必须在switch语句中处理0情况:

case 0:
  System.out.println("Zero");
  break;
通过这两个更改,您的代码可以正常工作

int revInteger = reverse(number * 10 + 1);
while (revInteger != 1)
{
    int modulus = revInteger % 10;
    revInteger /= 10;

    switch (modulus)
    {
    case 0:
        System.out.println("Zero");
        break;
    case 1:
        System.out.println("One");
        break;

    // snipped cases 2-8

    case 9:
        System.out.println("Nine");
        break;

    default:
        break;
    }
}

强制性Java 8流代码:

private static final Map<Character, String> MAP;
static {
    Map<Character, String> map = new HashMap<>();
    map.put('0', "ZERO");
    map.put('1', "ONE");
    ...
    MAP = Collections.unmodifiableMap(map);
}

以及其他一些解决方案

第一个简单地初始化数组并通过连接向后构造字符串。它使用
余数运算符(%)
索引到数组中

int n = 100;
String[] digitWords = { "ZERO", "ONE", "TWO", "THREE", "FOUR",
        "FIVE", "SIX", "SEVEN", "EIGHT", "NINE" };

String s = "";
while (n > 0) {
    s = digitWords[n % 10] + " " + s;
    n /= 10;
}

System.out.println(s);
或者使用Java流。这只是迭代连续的整数商,然后应用
余数运算符
来流式处理相应的数组元素。使用还原操作再次反向组装各个元件

n = 100;
String str = IntStream.iterate(n, i -> i > 0, i -> i = i / 10)
        .mapToObj(i->digitWords[i % 10]).reduce("", (a,b)->b = b + " " + a);

两种方法都可以打印

ONE ZERO ZERO 



为什么不尝试为模添加一个
案例0:
,这看起来像是在试图获得解决硬件问题的帮助。我建议设置一个断点并调试它。就我个人而言,我会在这里使用数组而不是映射。但是,表驱动的方法肯定是一条路要走+1@FoggyDay同意用数组代替map实现上述解决方案会更好,但根据这些条件,输出以无休止的循环显示。我已经展示了完整的代码。我已经剪掉了处理2到8的案例。是的,我已经解决了这个问题,它确实有效,但当我们输入任何负数时,它也必须显示无效值,所以当我输入数字-222时,它给了我无尽的循环。当数字为负数时,您需要在打印“无效值”后返回。
ONE ZERO ZERO