4

我的程序使用意大利语言环境,所以Float.parseFloat("8,00")必须运行良好。但是我在下面一行遇到了一个非常糟糕的 NFE:

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

我注意到,上面的代码在我对侦听器所做的一些更改中运行良好,这些更改看起来与这行代码无关。(现在我有一个 propertyChangeListener 可以在值更改时更新模型。

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)
4

3 回答 3

3

我的程序使用意大利语言环境,所以Float.parseFloat("8,00")必须运行良好。

Float.parseFloat。不依赖于语言环境。因此,有两种方法可以解决您的问题:

  • 像这样的格式:

    String.format(Locale.US, "%05.2f",info.getCuSurface())
    
  • 解析时替换逗号:

    info.setCuSurface(Float.parseFloat(
            ((String) cuSurfaceJTextField1.getValue()).replace(',','.')));
    
于 2013-12-30T17:28:23.977 回答
1

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

    }
}
于 2013-12-30T17:26:18.783 回答
1

看起来你的Locale? 我自己也看到过——在美国和其他地方,数字写成“8.00”,但在欧洲部分地区(法国给我带来了麻烦),数字写成“8,00”。似乎何时String.format()调用它是在Locale使用逗号的 a 中......但在 上设置值JTextField会自动解析传入的字符串,该字符串对事务Float.parseFloat()不敏感- 它查找就是这样。Locale.

于 2013-12-30T17:24:46.553 回答