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