Java 数字格式异常-对于输入字符串:“35,9”

Java 数字格式异常-对于输入字符串:“35,9”,java,numberformatexception,Java,Numberformatexception,我需要生成随机值并打印它们 但它抛出了一个例外: java.lang.NumberFormatException: For input string: "35,9" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241) at java.lang.Double.parseDouble(Double.java:540) at com.epam.lab.model.sweets.

我需要生成随机值并打印它们

但它抛出了一个例外:

 java.lang.NumberFormatException: For input string: "35,9"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
    at java.lang.Double.parseDouble(Double.java:540)
    at com.epam.lab.model.sweets.SweetsGenerator.paramFormatter(SweetsGenerator.java:71)
    at com.epam.lab.model.sweets.SweetsGenerator.next(SweetsGenerator.java:55)
    at com.epam.lab.model.NewYearGift.generate(NewYearGift.java:40)
    at com.epam.lab.controller.GiftController.generateGift(GiftController.java:86)
    at com.epam.lab.controller.GiftController.showGiftContent(GiftController.java:213)
    at com.epam.lab.view.Application.process(Application.java:89)
    at com.epam.lab.view.Application.estimateUserInput(Application.java:49)
    at com.epam.lab.view.Application.start(Application.java:43)
    at com.epam.lab.view.Main.main(Main.java:19)
它只发生在这里:

public Sweets next() {      
    Sweets current = instances[rand.nextInt(instances.length)];
    double sugarParam = paramFormatter(randomSugarLevel(), PRECISION);
    double weightParam = paramFormatter(randomWeight(), PRECISION);

    try {
        return (Sweets) current.getClass()
                .getConstructor(double.class, double.class)
                .newInstance(sugarParam, weightParam);
        // Report programmer errors at run time:
    } catch (Exception e) {
        LOG.error("RuntimeException", e);
        throw new RuntimeException(e);
    }
}


private double paramFormatter(double sugarParam, DecimalFormat df) {
    return Double.parseDouble(df.format(sugarParam));
}


private double randomWeight() {
    return WEIGHT_MIN + (Math.random() * ((WEIGHT_MAX - WEIGHT_MIN) + 1));
}


private double randomSugarLevel() {
    return SUGAR_MIN + (Math.random() * ((SUGAR_MAX - SUGAR_MIN) + 1));
}
而且精度是恒定的:

私有静态最终DecimalFormat精度=新DecimalFormat

但一切看起来都很好

如何解决此问题?

输入字符串包含,而不是。。将,替换为。为了摆脱异常。理想情况下,输入应为35.9,而不是35.9

如果使用,作为十进制分隔符,则可以使用十进制格式符号替换,作为十进制分隔符

以下代码演示DecimalFormatSymbols类的使用:

上面的代码打印输入字符串包含的35.9,而不是。。将,替换为。为了摆脱异常。理想情况下,输入应为35.9,而不是35.9

如果使用,作为十进制分隔符,则可以使用十进制格式符号替换,作为十进制分隔符

以下代码演示DecimalFormatSymbols类的使用:



上面的代码打印35.9

请尝试使用点而不是逗号39.9而不是39.5。您的格式模式应该是@Matheus:真的吗?:模式字符逗号表示分组分隔符,而OP实际上将其用作十进制分隔符。相反,应将区域设置更改为使用逗号作为小数分隔符的区域设置。是否要使用的小数分隔符为,而不是。,还是要将35.9与。作为您的输入?由于使用的区域设置不同。或者,作为小数点分隔符,对您试图执行的操作存在混淆。@JonathanDrapeau:Matheus谈论的是模式而不是实际字符:尝试使用点而不是逗号39.9而不是逗号39.5您的格式模式应该是,@Matheus:真的吗?:模式字符逗号表示分组分隔符,而OP实际上将其用作十进制分隔符。相反,应将区域设置更改为使用逗号作为小数分隔符的区域设置。是否要使用的小数分隔符为,而不是。,还是要将35.9与。作为您的输入?由于使用的区域设置不同。或者,作为小数点分隔符,对您要做的事情存在混淆。@JonathanDrapeau:Matheus谈论的是模式而不是实际的字符:不,它与实际的字符应该没有区别。问题在于用于DecimalFormat的区域设置。并不是世界上任何地方都有小数点。他的格式也可能不同。@rahulbobbhate都可以,但应该是dfs.setDecimalSeparator';取而代之的是您的解决方案。@nazar_art,十进制分隔符的默认符号是。,因此我们不需要显式设置它。但是,在您的情况下,您接收的输入使用的是十进制分隔符as,而不是,。因此您需要显式地设置它,或者您使用的区域设置使用,作为默认的十进制分隔符,在这种情况下,您是对的。@Rahulbabhate我在另一台电脑上编写了项目,现在部署到这台电脑上。@Rahulbabhate默认符号取决于创建DecimalFormat的系统的区域设置,除非在构造函数中或之后指定,或由创建DecimalFormat的应用程序显式设置。。。它不是一成不变的。不,它的本质应该是一样的。问题在于用于DecimalFormat的区域设置。并不是世界上任何地方都有小数点。他的格式也可能不同。@rahulbobbhate都可以,但应该是dfs.setDecimalSeparator';取而代之的是您的解决方案。@nazar_art,十进制分隔符的默认符号是。,因此我们不需要显式设置它。但是,在您的情况下,您接收的输入使用的是十进制分隔符as,而不是,。因此您需要显式地设置它,或者您使用的区域设置使用,作为默认的十进制分隔符,在这种情况下,您是对的。@Rahulbabhate我在另一台电脑上编写了项目,现在部署到这台电脑上。@Rahulbabhate默认符号取决于创建DecimalFormat的系统的区域设置,除非在构造函数中或之后指定,或由创建DecimalFormat的应用程序显式设置。。。它不是一成不变的。
DecimalFormat df = new DecimalFormat("#.#");
DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance();
dfs.setDecimalSeparator(',');
df.setDecimalFormatSymbols(dfs);
System.out.println(df.parse("35,9"));