Проблемы с использованием DecimalFormat - PullRequest
3 голосов
/ 17 сентября 2010

У меня проблемы с использованием DecimalFormat, когда я собираюсь распечатать коэффициенты после регрессии.

Вот часть кода, которая сталкивается с проблемами;

DecimalFormat twoDForm = new DecimalFormat("0.00");   
private double s(double d){  
    return Double.valueOf(twoDForm.format(d));  
}  

и вот сообщение об ошибке в eclipse;

Exception in thread "main" java.lang.NumberFormatException: For input string: "0,16"  
 at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)  
 at java.lang.Double.valueOf(Unknown Source)  
 at model.ARF2.s(ARF2.java:126)  
 at model.ARF2.printBestModel(ARF2.java:114)  
 at testing.testclass3.bestForecastingModel(testclass3.java:69)  
 at testing.testclass3.main(testclass3.java:36)  

Пожалуйста, дайте мне знать, если у кого-нибудь есть какие-либо помехи относительно того, как исправить код.Я хочу два десятичных знака на моих коэффициентах.

Спасибо

Ларс

Ответы [ 6 ]

15 голосов
/ 24 мая 2012

использование:

    DecimalFormat twoDForm = new DecimalFormat("#.##");
    DecimalFormatSymbols dfs = new DecimalFormatSymbols();
    dfs.setDecimalSeparator('.');
    twoDForm.setDecimalFormatSymbols(dfs);
2 голосов
/ 17 сентября 2010

Вы столкнулись с проблемой i18n. DecimalFormat использует вашу локаль по умолчанию, которая задает десятичный разделитель как , . Однако Double.valueOf не использует локаль. Всегда ожидается, что десятичный разделитель равен . .

Если вы хотите проанализировать строку, отформатированную с DecimalFormat, вам нужно использовать DecimalFormat.parse

2 голосов
/ 17 сентября 2010

http://download.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html

Следующая выдержка является частью вашей проблемы:

Чтобы получить NumberFormat для конкретный язык, в том числе по умолчанию локаль, позвоните одному из NumberFormat заводские методы, такие как деЫпзЬапсе (). В общем, не звоните конструкторы DecimalFormat напрямую, так как NumberFormat фабричные методы могут возвращать подклассы кроме десятичного формата. Если тебе надо чтобы настроить объект формата, сделайте как то так:

 NumberFormat f = NumberFormat.getInstance(loc);
 if (f instanceof DecimalFormat) {
     ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);
 }

Возможно, вы захотите использовать метод applyPattern:

applyPattern

public void applyPattern (String шаблон) Примените данный шаблон к этот объект формата. Шаблон это краткая спецификация для различные свойства форматирования. Эти свойства также могут быть изменены индивидуально через различные методы установки. Там нет предела целые цифры задаются этим рутина, так как это типичное желание конечного пользователя; использовать setMaximumInteger если вы хотите установить реальное значение. За отрицательные числа, используйте вторую шаблон, разделенный точкой с запятой

Пример "#, # 00.0 #" -> 1 234,56

Это означает минимум 2 целых числа цифры, 1 дробная цифра и максимум 2 цифры дроби.

Пример: "#, # 00.0 #; (#, # 00.0 #)" для негативы в скобках.

При отрицательных шаблонах минимальное и максимальные значения игнорируются; это предполагается установить в положительном шаблон.

Броски: NullPointerException - если шаблон является нулевым IllegalArgumentException - если данный шаблон недействителен.

1 голос
/ 17 сентября 2010

Я думаю, что вы намеревались сделать:

private static String s(double d) {
   return twoDForm.format(d);
}
0 голосов
/ 29 января 2014

Проверьте ваш язык.

DecimalFormat twoDForm = new DecimalFormat("0.00");   
    private double s(double d){ 

    String doubleString =  displayNumberAmount(twoDForm.format(d));
        return Double.valueOf(doubleString);  
    } 

    public static String displayNumberAmount(String amount) {

            NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.CANADA_FRENCH);

            Number number = 0;

            try {
                number = numberFormat.parse(amount);

            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return String.format(Locale.US, "%1$,.2f", number);
        }
0 голосов
/ 17 сентября 2010

Вы пытаетесь отформатировать номер?Или вокруг этого?Если вы форматируете его, не должен ли ваш метод "s" (плохое имя IMO, кстати, но он частный, так что это ваш вызов) вернуть java.lang.String вместо double?

...