【问题标题】:NumberFormatException in String.Format("%05.2f", 8.00)String.Format("%05.2f", 8.00) 中的 NumberFormatException
【发布时间】:2013-12-30 17:13:24
【问题描述】:

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

【问题讨论】:

  • Parsefloat 不是特定于语言环境的。相关问题:stackoverflow.com/questions/5233012/…
  • @Simplefish 没错!也许我的那行代码以前从未执行过,我认为它运行良好!我测试了一个简单的样本。没有什么东西可以给我一个本地化的 parseFloat 吗? java返回给我的值有,修改它不是一个好习惯。
  • @HotLicks 我必须转换并格式化该值,因为我的 JFormattedTextField 被屏蔽为“##,##”。所以我需要字符串
  • @Johnny NumberFormat 和 DecimalFormat 可能是你想的。

标签: java string-formatting jformattedtextfield propertychangelistener


【解决方案1】:

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

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

  • 格式如下:

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

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

【讨论】:

  • 就是这样,伙计!当我使用 String.format(Local.getDefault(),.... 并且我的 main 的第一行是 Locale.setDefault(Locale.ITALY);
【解决方案2】:

您的Locale 似乎有些混乱?我自己也看到过——在美国和其他地方,数字写成“8.00”,但在欧洲部分地区(法国给我带来了麻烦),数字写成“8,00”。似乎当String.format() 被调用时,它在使用逗号的Locale 中......但是在JTextField 上设置值会自动用Float.parseFloat() 解析传入的字符串,这对Locale 不敏感很重要 - 它会查找 .,仅此而已。

【讨论】:

  • 无论如何错误不在该行!并且程序没有到达那条线!
  • 哪一行? String.format()JTextField.setValue() 发生在同一行,即出现错误的行。
【解决方案3】:

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

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多