NumberFormatException в String.Format(%05.2f, 8.00)

Я использую итальянский язык для своей программы, поэтому Float.parseFloat("8,00") должен работать хорошо. Но я столкнулся с очень плохим NFE в следующей строке:

this.cuSurfaceJTextField1.setValue(
    String.format("%05.2f",info.getCuSurface()));

Я отмечаю, что приведенный выше код работал хорошо до некоторых изменений, которые я внес в слушатели, которые не выглядят связанными с этой строкой кода. (Теперь у меня есть свойствоChangeListener, которое обновляет модель при изменении значения.

this.cuSurfaceJTextField1.addPropertyChangeListener("value", 
        new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        info.setCuSurface(Float.parseFloat(
                (String)cuSurfaceJTextField1.getValue()));
        updateCuSurface();
    }
});

Полезная часть исключения:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "08,00"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
    at java.lang.Float.parseFloat(Float.java:452)
    at View.bars.QuadrateJPanel$11.propertyChange(QuadrateJPanel.java:348)
    at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:328)
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
    at java.awt.Component.firePropertyChange(Component.java:8382)
    at javax.swing.JFormattedTextField.setValue(JFormattedTextField.java:799)
    at javax.swing.JFormattedTextField.setValue(JFormattedTextField.java:502)

person Johnny    schedule 30.12.2013    source источник
comment
Parsefloat не зависит от локали. Связанный вопрос: stackoverflow.com/questions/5233012/   -  person Simplefish    schedule 30.12.2013
comment
@Simplefish Верно! Возможно, эта строка моего кода никогда раньше не выполнялась, и я подумал, что она работает хорошо! Я протестировал его на простом образце. Разве нет чего-то, что дает мне локализованный parseFloat? значение, которое возвращает мне java, имеет , и изменять его не рекомендуется.   -  person Johnny    schedule 30.12.2013
comment
@HotLicks Я должен преобразовать и отформатировать значение, потому что мой JFormattedTextField замаскирован как ##, ##. Так что мне нужна строка   -  person Johnny    schedule 30.12.2013
comment
@Johnny NumberFormat и DecimalFormat, вероятно, то, о чем вы думаете.   -  person Simplefish    schedule 30.12.2013


Ответы (3)


Я использую итальянский язык для своей программы, поэтому Float.parseFloat("8,00") должен работать хорошо.

Float.parseFloat не зависит от языкового стандарта. Итак, есть два способа решить вашу проблему:

  • Отформатируйте так:

    String.format(Locale.US, "%05.2f",info.getCuSurface())
    
  • Замените запятую при разборе:

    info.setCuSurface(Float.parseFloat(
            ((String) cuSurfaceJTextField1.getValue()).replace(',','.')));
    
person Martijn Courteaux    schedule 30.12.2013
comment
Вот и все! Он отлично работает, когда я использовал String.format(Local.getDefault(),.... и первая строка моего основного файла Locale.setDefault(Locale.ITALY); - person Johnny; 30.12.2013

Похоже, у вас может быть некоторая путаница с вашим Locale? Я видел это сам - в Америке и других местах цифры пишутся как "8.00", но в некоторых частях Европы (Франция доставила мне неприятности) они пишутся как "8,00". Похоже, что когда вызывается String.format(), он находится в Locale, в котором используются запятые... но установка значения в JTextField автоматически анализирует переданную строку с Float.parseFloat(), которая не чувствительна к Locale, она ищет . и все.

person dcsohl    schedule 30.12.2013
comment
В любом случае ошибка не в этой строке! и программа не доходит до этой строки! - person Johnny; 30.12.2013
comment
Какая линия? String.format() и JTextField.setValue() происходят в одной и той же строке, в строке, вызвавшей ошибку. - person dcsohl; 30.12.2013

parseFloat не использует локаль по умолчанию, он вызывает FloatingDecimal.readJavaFormatString(s).floatValue().

Вместо этого используйте NumberFormat, который будет учитывать набор локали.

public class NFE {

    public static void main(String[] args) throws Exception
    {
        Locale.setDefault(Locale.ITALIAN);
        NumberFormat format = NumberFormat.getInstance();
        //Float.parseFloat("8,00");
        System.out.println(format.parse("8,00"));

    }
}
person earcam    schedule 30.12.2013