Java 字符串格式的NumberFormatException(“05.2f”和“8.00”)

Java 字符串格式的NumberFormatException(“05.2f”和“8.00”),java,string-formatting,jformattedtextfield,propertychangelistener,Java,String Formatting,Jformattedtextfield,Propertychangelistener,我的程序使用意大利语言环境,因此Float.parseFloat(“8,00”)必须运行良好。 但我在以下几行中遇到了一个非常糟糕的NFE: this.cuSurfaceJTextField1.setValue( String.format("%05.2f",info.getCuSurface())); 我注意到上面的代码在我对监听器所做的一些更改之前工作得很好,这些更改看起来与这行代码无关。(现在我有了一个propertyChangeListener,它在值更改时更新模型。) thi

我的程序使用意大利语言环境,因此
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)

看起来您的
语言环境可能有些混乱
?我自己也看到过-在美国和其他地方,数字写为“8.00”,但在欧洲的部分地区(法国给我带来了麻烦),它写为“8,00”。好像
String.format()
被调用,它位于使用逗号的
区域设置中……但是在
JTextField
上设置值会自动使用
Float.parseFloat()解析传入的字符串
区域设置不敏感
重要-它查找
,就是这样。

parseFloat不使用默认区域设置,它调用FloatingDecimal.readJavaFormatString.floatValue()

而是使用符合区域设置的

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

    }
}
我的程序使用意大利语言环境,因此
Float.parseFloat(“8,00”)
必须运行良好

不。
Float.parseFloat
不依赖于区域设置。因此,有两种方法可以解决您的问题:

  • 格式如下:

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

    info.setCuSurface(Float.parseFloat(
            ((String) cuSurfaceJTextField1.getValue()).replace(',','.')));
    

Parsefloat不是特定于语言环境的。相关问题:@Simplefish没错!也许我的那行代码以前从未执行过,我认为它工作得很好!我用一个简单的示例对它进行了测试。难道没有什么东西可以给我一个本地化的Parsefloat吗?java返回的值有,更改它不是一个好的做法。@Hot单击我必须转换并格式化该值,因为我的JFormattedTextField被屏蔽为“##,##”String@JohnnyNumberFormat和DecimalFormat可能是您正在考虑的。无论如何,错误不在那一行!程序没有到达那一行!哪一行?字符串.format()
JTextField.setValue()
发生在同一行上,就是给您带来错误的那一行。就是这样,伙计!当我使用String.format(Local.getDefault(),…..)时,它工作得非常好,我的main的第一行是Locale.setDefault(Locale.意大利语);