Int to English words in Java

后端 未结 4 1243
情歌与酒
情歌与酒 2020-12-07 04:20

Here I am to ask something weird.

I would like to ask that is there any method/logic by which we can convert an integer value to a string value containing the Englis

4条回答
  •  抹茶落季
    2020-12-07 05:02

    Check out this code, it might be what you're looking for. For example, inside the main method if we had:

    System.out.println(convert(22));
    

    Output:

    twenty two
    

    EDIT I've reproduced the code below, cleaning up the formatting a bit (main-method is at the bottom):

    import java.text.DecimalFormat;
    
    public class EnglishNumberToWords {
    
        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);
    
            // XXXnnnnnnnnn
            int billions = Integer.parseInt(snumber.substring(0, 3));
            // nnnXXXnnnnnn
            int millions = Integer.parseInt(snumber.substring(3, 6));
            // nnnnnnXXXnnn
            int hundredThousands = Integer.parseInt(snumber.substring(6, 9));
            // nnnnnnnnnXXX
            int thousands = Integer.parseInt(snumber.substring(9, 12));
    
            String tradBillions;
            switch (billions) {
            case 0:
                tradBillions = "";
                break;
            case 1:
                tradBillions = convertLessThanOneThousand(billions) + " billion ";
                break;
            default:
                tradBillions = convertLessThanOneThousand(billions) + " billion ";
            }
            String result = tradBillions;
    
            String tradMillions;
            switch (millions) {
            case 0:
                tradMillions = "";
                break;
            case 1:
                tradMillions = convertLessThanOneThousand(millions) + " million ";
                break;
            default:
                tradMillions = convertLessThanOneThousand(millions) + " million ";
            }
            result = result + tradMillions;
    
            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(convert(22));  // "twenty two"
        }
    }
    

提交回复
热议问题