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.意大利语);