将数字最多4个数字转换为不起作用的字的方法

时间:2017-05-05 00:05:47

标签: java

我正在尝试更改此处的代码,因此它只适用于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", " ");
}

1 个答案:

答案 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位的数字,您必须检查并抛出正确的异常