Исключение формата числа - для входной строки: "35,9"
Мне нужно генерировать случайные значения и печатать их.
Но это бросает исключение:
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));
}
И точность постоянна:
приватная статическая final DecimalFormat PRECISION = new DecimalFormat("#.#");
Но все выглядит хорошо.
Как решить эту проблему?
1 ответ
Решение
Входная строка содержит ,
вместо .
, Заменить ,
с .
избавиться от исключения. В идеале вход должен быть 35.9
и не 35,9
,
Если вы используете ,
в качестве десятичного разделителя, то вы можете использовать DecimalFormatSymbols
заменить ,
в качестве десятичного разделителя.
Следующий код демонстрирует использование DecimalFormatSymbols
учебный класс:
DecimalFormat df = new DecimalFormat("#.#");
DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance();
dfs.setDecimalSeparator(',');
df.setDecimalFormatSymbols(dfs);
System.out.println(df.parse("35,9"));
Выше код распечатывает 35.9