如何在java中将数字转换为单词 - 在java中计算金钱

时间:2017-01-20 05:25:40

标签: java

因此,对于另一个项目,我应该创建一个程序,提示用户提供货币价值,并打印出最低数量的账单和硬币。因此,例如,如果用户输入47.63,则输出为:

0百 2二十年代 0十等等。

我的问题是,当我输入某个值(即186.41)时,我应该拿出1百个 一个五十年代 1二十多岁 1十天 1个法孚 1个 1宿舍 1个角度 1尼克斯 1便士。

然而,我的便士输出说“0便士” 这是我的代码:

 public class CountingMoney {
    public static BufferedReader delta = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String [] args) throws IOException{
        run();
    }

    public static void run() throws IOException{
        System.out.println("Please enter your monetary value");
        String userinput = delta.readLine();
        double input = Double.parseDouble(userinput);

        int amount = (int) (input / 100);
        input -= amount * 100;
        System.out.println(amount+ " Hundreds");

        amount = (int) (input/50);
        input -= amount * 50;
        System.out.println(amount + " Fifties");

        amount = (int) (input/20);
        input -= amount * 20;
        System.out.println(amount + " Twenties");

        amount = (int) (input/10);
        input -= amount*10;
        System.out.println(amount + " Tens");

        amount = (int) (input/5);
        input -= amount *5;
        System.out.println(amount + " Fives");

        amount = (int) (input/1);
        input -= amount *1;
        System.out.println(amount + " Ones");

        amount = (int) (input/.25);
        input -= amount * .25;
        System.out.println(amount + " Quarters");

        amount = (int) (input/.10);
        input -= amount * .10;
        System.out.println(amount + " Dimes");

        amount = (int) (input/.05);
        input -= amount * .05;
        System.out.println(amount + " Nickles");

        amount = (int) (input/.01);
        input -= amount * .01;
        System.out.println(amount + " Pennies");

    }

}

4 个答案:

答案 0 :(得分:1)

下面的java程序演示了如何将数字从零转换为一百万。

NumberToStringLiteral 类:

public class NumberToStringLiteral
{

    public static void main(String[] args)
    {
        NumberToStringLiteral numberToStringLiteral = new NumberToStringLiteral();
        int number = 123456;
        String stringLiteral = numberToStringLiteral.convertIntegerToStringLiteral(number);
        System.out.println(stringLiteral);
    }
    
    private String convertIntegerToStringLiteral(int number)
    {
        if (number < 100)
            return from_0_To_100(number);
        
        if ( number >= 100 && number < 1000 )
            return from_101_To_999(number);
        
        if ( number >= 1000 && number <= 99999)
            return from_1000_and_99999(number);
        
        if (number <= 1000000)
            return from_100000_and_above(number);
        
        return Digits.OVER_ONE_MILLION.getStringLiteral();
    }
    
    private String from_0_To_100(int number)
    {
        if (number <= 19 )
            return ZeroToNineteen.getStringLiteral(number);
        
        String LastDigit = ( ZeroToNineteen.getStringLiteral(number % 10) != ZeroToNineteen.ZERO.getStringLiteral() ) ? 
                            ZeroToNineteen.getStringLiteral(number % 10) : "";
        return Tens.getStringLiteralFromNumber( (number - (number % 10 )) ) + " " + LastDigit;
    }
    
    private String from_101_To_999(int number)
    {
        String LastDigit = ( ZeroToNineteen.getStringLiteral(number % 100) != ZeroToNineteen.ZERO.getStringLiteral() ) ?
                            ZeroToNineteen.getStringLiteral(number % 100)  : "";
        
        if ( (number % 100) > 19)
            LastDigit = from_0_To_100(number % 100);
            
        if (LastDigit.isBlank())
            return ZeroToNineteen.getStringLiteral(number / 100 ) + Digits.getStringLiteral(getNumberOfDigit(0));
            
        return ZeroToNineteen.getStringLiteral(number / 100 ) + Digits.getStringLiteral(getNumberOfDigit(number)) + LastDigit;
    }
        
    private String from_1000_and_99999(int number)
    {
        String LastDigit = (number % 1000 < 20 ) ? from_0_To_100(number % 1000) : from_101_To_999(number % 1000);
        
        if (LastDigit.equalsIgnoreCase(ZeroToNineteen.ZERO.getStringLiteral()))
            LastDigit = "";
        
        return from_0_To_100(number / 1000 ) + Digits.getStringLiteral(getNumberOfDigit(number)) + LastDigit;
    }
    
    private String from_100000_and_above(int number)
    {
        if (number == 1000000)
            return Digits.ONE_MILLION.getStringLiteral();
        
        String lastThreeDigit = (number % 1000 <= 100)  ? from_0_To_100(number % 1000) : from_101_To_999(number % 1000);
        
        if (lastThreeDigit.equalsIgnoreCase(ZeroToNineteen.ZERO.toString()))
            lastThreeDigit = "";
        
        String number1 = from_101_To_999(number / 1000) + Digits.THOUSAND.getStringLiteral() +  lastThreeDigit;
        return String.valueOf(number1);
    }
    
    private int getNumberOfDigit(int number)
    {
        int count = 0;
        while ( number != 0 )
        {
            number /=  10;
            count++;
        }
        return count;
    }
}

ZeroToNineteen 枚举:

public enum ZeroToNineteen
{
    ZERO(0, "zero"), 
    ONE(1, "one"),
    TWO(2, "two"),
    THREE(3, "three"),
    FOUR(4, "four"),
    FIVE(5, "five"),
    SIX(6, "six"),
    SEVEN(7, "seven"),
    EIGHT(8, "eight"),
    NINE(9, "nine"),
    TEN(10, "ten"),
    ELEVEN(11, "eleven"),
    TWELVE(12, "twelve"),
    THIRTEEN(13, "thirteen"),
    FOURTEEN(14, "fourteen"),
    FIFTEEN(15, "fifteen"),
    SIXTEEN(16, "sixteen"),
    SEVENTEEN(17, "seventeen"),
    EIGHTEEN(18, "eighteen"),
    NINETEEN(19, "nineteen");
    
    
    private int number;
    private String stringLiteral;
    public static Map<Integer, String> stringLiteralMap;
    
    ZeroToNineteen(int number, String stringLiteral)
    {
        this.number = number;
        this.stringLiteral = stringLiteral;
    }
    
    public int getNumber()
    {
        return this.number;
    }
    
    public String getStringLiteral()
    {
        return this.stringLiteral;
    }
    
    public static String getStringLiteral(int number)
    {
        if (stringLiteralMap == null)
            addData();
        
        return stringLiteralMap.get(number);
    }
    
    private static void addData()
    {
        stringLiteralMap = new HashMap<>();
        for (ZeroToNineteen zeroToNineteen : ZeroToNineteen.values())
        {
            stringLiteralMap.put(zeroToNineteen.getNumber(), zeroToNineteen.getStringLiteral());
        }
    }
}

十位枚举:

public enum Tens
{
    TEN(10, "ten"),
    TWENTY(20, "twenty"),
    THIRTY(30, "thirty"),
    FORTY(40, "forty"),
    FIFTY(50, "fifty"),
    SIXTY(60, "sixty"),
    SEVENTY(70, "seventy"),
    EIGHTY(80, "eighty"),
    NINETY(90, "ninety"),
    HUNDRED(100, "one hundred");
    
    
    private int number;
    private String stringLiteral;
    private static Map<Integer, String> stringLiteralMap;
    
    Tens(int number, String stringLiteral)
    {
        this.number = number;
        this.stringLiteral = stringLiteral;
    }
    
    public int getNumber()
    {
        return this.number;
    }
    
    public String getStringLiteral()
    {
        return this.stringLiteral;
    }
    
    public static String getStringLiteralFromNumber(int number)
    {
        if (stringLiteralMap == null)
            addDataToStringLiteralMap();
        
        return stringLiteralMap.get(number);
    }
    
    private static void addDataToStringLiteralMap()
    {
        stringLiteralMap = new HashMap<Integer, String>();
        for (Tens tens : Tens.values())
            stringLiteralMap.put(tens.getNumber(), tens.getStringLiteral());
    }
}

数字枚举:

public enum Digits
{
    HUNDRED(3, " hundred and "),
    THOUSAND(4, " thousand "),
    TEN_THOUSAND(5," thousand "),
    ONLY_HUNDRED(0, " hundred" ),
    ONE_MILLION(1000000, "one million"),
    OVER_ONE_MILLION(1000001, "over one million");
    
    private int digit;
    private String stringLiteral;
    private static Map<Integer, String> stringLiteralMap;
    
    private Digits(int digit, String stringLiteral)
    {
        this.digit = digit;
        this.stringLiteral = stringLiteral;
    }
    
    public int getDigit()
    {
        return this.digit;
    }
    
    public String getStringLiteral()
    {
        return this.stringLiteral;
    }
    
    public static String getStringLiteral(int number)
    {
        if ( stringLiteralMap == null )
            addStringLiteralMap();
        
        return stringLiteralMap.get(number);
    }
    
    private static void addStringLiteralMap()
    {
        stringLiteralMap = new HashMap<Integer, String>();
        for ( Digits digits : Digits.values() )
            stringLiteralMap.put(digits.getDigit(), digits.getStringLiteral());
    }
}

输出:

one hundred and twenty three thousand four hundred and fifty six

注意:我已经将所有三个枚举用于常量变量,您也可以使用数组。

希望对你有帮助,如有疑问请在评论区告诉我。

答案 1 :(得分:0)

通过here更好地解释了您所面临的问题。

要克服此用途BigDecimal。但请务必设置ScaleRoundingMode。如果不是,您可能会在分割操作期间结束java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

有关如何修改的示例代码:

amount = bigDecimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).intValue();
bigDecimal = bigDecimal.subtract(new BigDecimal(amount * 100));
System.out.println(amount+ " Hundreds");

答案 2 :(得分:0)

当您使用doubleint投射(int)时,无论double值与其正上方的整数有多接近,它都会向下舍入。 doubles不能完全代表186.41之类的值,因为它们以二进制而不是十进制存储。当你开始用它们进行大量计算时,错误就会开始累积。

当我尝试你的程序时,显示正在舍入的值:

    System.out.println("result of division is " + (input/.01));
    amount = (int) (input/.01);
    input -= amount * .01;
    System.out.println(amount + " Pennies");

显示

    result of division is 0.999999999999658

这非常非常接近1,因此没有累积太多错误。但这并不准确。自从(int)向下舍入后,amount将为0。

有两种方法可以解决这个问题:

1)按照其他答案的建议使用BigDecimal。这是处理金钱的首选方法。它将完全代表小数位。

2)使用Math.round()代替(int),例如

amount = (int) Math.round(input / .01);
Math.round上的

double会返回long,因此您仍需要强制转换,但它会从整数转换为另一个整数,因此不会涉及舍入。

我仍然建议使用BigDecimal。但是,这应该可以帮助您看到在其他情况下,您确实需要处理double,您需要注意你做什么样的舍入。转换为(int)通常会出错,具体取决于您要做的事情。

答案 3 :(得分:0)

您可以使用以下代码,并在link

中提供

有关更多参考和讨论,请参阅this stack-overflow post

希望它能解决您的需求。

package com.test;

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 EnglishNumberToWords() {}

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", " ");
}

/**
 * testing
 * @param args
 */
public static void main(String[] args) {
    System.out.println("*0* " + EnglishNumberToWords.convert(0));
    System.out.println("*1* " + EnglishNumberToWords.convert(1));
    System.out.println("*16* " + EnglishNumberToWords.convert(16));
    System.out.println("*100* " + EnglishNumberToWords.convert(100));
    System.out.println("*118* " + EnglishNumberToWords.convert(118));
    System.out.println("*200* " + EnglishNumberToWords.convert(200));
    System.out.println("*219* " + EnglishNumberToWords.convert(219));
    System.out.println("*800* " + EnglishNumberToWords.convert(800));
    System.out.println("*801* " + EnglishNumberToWords.convert(801));
    System.out.println("*1316* " + EnglishNumberToWords.convert(1316));
    System.out.println("*1316* " + EnglishNumberToWords.convert(1316));
    System.out.println("*2000000* " + EnglishNumberToWords.convert(2000000));
    System.out.println("*3000200* " + EnglishNumberToWords.convert(3000200));
    System.out.println("*700000* " + EnglishNumberToWords.convert(700000));
    System.out.println("*9000000* " + EnglishNumberToWords.convert(9000000));
    System.out.println("*9001000* " + EnglishNumberToWords.convert(9001000));
    System.out.println("*123456789* " + EnglishNumberToWords.convert(123456789));
    System.out.println("*2147483647* " + EnglishNumberToWords.convert(2147483647));
    System.out.println("*3000000010L* " + EnglishNumberToWords.convert(3000000010L));


}

}