Intellij Idea 抵押计算器(java.util.InputMismatchException)[重复]

c8ib6hqw  于 2023-08-03  发布在  Java
关注(0)|答案(3)|浏览(86)

此问题在此处已有答案

How to specify decimal delimiter for Scanner.nextDouble()(3个答案)
上个月关门了。
你好,我有一个问题,当以下教程在youtube(代码是在java中,我使用intelliji的想法)

import java.text.NumberFormat;
import java.util.Locale;
import java.util.Scanner;

public class Main {
    public static void main(String[] arg) {
        final byte MONTHS_IN_YEAR = 12;
        final byte PERCENT = 100;
        Scanner scanner = new Scanner(System.in);

        System.out.print("Principal: ");
        int principal = scanner.nextInt();

        System.out.print("Annual Interest Rate: ");
        float annualInterest = scanner.nextFloat();
        float monthlyInterest = annualInterest / PERCENT / MONTHS_IN_YEAR;

        System.out.print("Period (Years): ");
        byte years = scanner.nextByte();
        int numberOfPayments = years * MONTHS_IN_YEAR;

        double mortgage = principal
                * (monthlyInterest * Math.pow(1 + monthlyInterest, numberOfPayments))
                / (Math.pow(1 + monthlyInterest, numberOfPayments) - 1);
        String mortgageFormatted = NumberFormat.getCurrencyInstance(Locale.US).format(mortgage);
        System.out.println("Mortgage: " + mortgageFormatted);
    }
}

字符串
问题是当我输入年利率(如3.92)时,它给予我以下错误:

Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:947)
    at java.base/java.util.Scanner.next(Scanner.java:1602)
    at java.base/java.util.Scanner.nextFloat(Scanner.java:2505)
    at com.codewithtamer.Main.main(Main.java:17)


也谢谢你帮助像我这样的初学者:),+我想我不知怎么搞砸了这篇文章的格式抱歉

ogq8wdun

ogq8wdun1#

如果你想在你的Scanner中使用一个不同于默认语言环境(Java从操作系统中获取的语言环境)的语言环境,你可以这样做:

class App {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println(s.locale());
        s.useLocale(Locale.US);
        System.out.println(s.nextFloat());
    }
}

字符串
这将显示您当前的区域设置(对我来说,它打印en_AU),然后设置扫描仪使用不同的区域设置。
Locale.US需要.作为小数点分隔符,Locale.FRANCE需要,,依此类推。

f5emj3cl

f5emj3cl2#

不幸的是,在某些IDE的某些版本中,java.util.Scanner以欧式模式(即带小数点逗号)。正如StackOverflow Q&A(Scanner.next... throws java.util.InputMismatchException for Float but not for Int)所建议的那样,在Eclipse和Netbeans中已经观察到了这一点。您可以考虑更改IDE的版本,或者您可以使用逗号(不理想)编写百分比,或者您可以依赖Float.parseFloat(),如下所示:

System.out.print("Annual Interest Rate: ");
float annualInterest = Float.parseFloat(scanner.next());
float monthlyInterest = annualInterest / PERCENT / MONTHS_IN_YEAR;

字符串
这应该适用于小数点,因为Float.parseFloat()不依赖于位置,并且总是需要小数点。

e0bqpujr

e0bqpujr3#

根据JavaDoc for Scanner#nextFloat

  • "...如果下一个标记与Float正则表达式不匹配或超出范围,则抛出[an] InputMismatchException..."。*

而且,nextInt 方法也是如此-如果值不是整数值,则抛出异常。
不过,需要注意的是,您可以使用 nextFloat 来捕获整数值。
例如,在一个示例中,

Principal: 1
Annual Interest Rate: 2
Period (Years): 3
Mortgage: $0.03

字符串
还有

Principal: 1.23
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:947)
    at java.base/java.util.Scanner.next(Scanner.java:1602)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2267)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2221)
    at Example.main(Example.java:14)

相关问题