【发布时间】:2017-09-30 23:32:42
【问题描述】:
我曾经写过这段代码来格式化JFormattedTextField的输入
DecimalFormat decimalFormat = new DecimalFormat("#0.00");
NumberFormatter nf = new NumberFormatter(decimalFormat);
nf.setValueClass(Double.class);
nf.setAllowsInvalid(true);
nf.setOverwriteMode(false);
tfPreisIntern = new JFormattedTextField(nf);
一段时间后,我意识到如果用户输入例如4,50 而不是4.50 则该值设置为4.00 而不是4.50 或4,50 时会出现问题。我认为这是我的DecimalFormat 的问题。现在我的问题是,是否可以使用逗号和点作为十进制分隔符?变通方法也可以
我将值从JFormattedTextField 转换为BigDecimal 的方法:
public static BigDecimal getBigDecimal(Object value) {
BigDecimal ret = null;
if (value != null) {
if (value instanceof BigDecimal) {
ret = (BigDecimal) value;
} else if (value instanceof String) {
ret = new BigDecimal((String) value);
} else if (value instanceof BigInteger) {
ret = new BigDecimal((BigInteger) value);
} else if (value instanceof Number) {
ret = new BigDecimal(((Number) value).doubleValue());
} else {
throw new ClassCastException("Not possible to coerce [" + value + "] from class " + value.getClass()
+ " into a BigDecimal.");
}
}
return ret;
}
我在这里看到的逗号问题是构造函数BigDecimal(string) 只允许小数点而不是逗号
编辑:
现在尝试像这样使用MaskFormatter:
MaskFormatter mask = new MaskFormatter("*#.##");
mask.setPlaceholderCharacter(' ');
mask.setCommitsOnValidEdit(false);
但我不能输入像2.50 这样的值。这只有在我使用像 #.## 这样的掩码时才有效。但我需要有可能在点之前有 1 位和 2 位数字的值
【问题讨论】:
-
我猜
setAllowsInvalid(true)将允许解析和无效值,但会给你最接近的值,使用comma,只有左边部分会匹配,所以它无法检索@ 987654340@。我没有文档(还)来写一个关于这个的答案 -
关于你的编辑,我不久前也遇到过类似的问题,幸运的是,格式只有
"123456.789"或"123456,789",所以只有小数分隔符,所以我简单地替换@987654343 @ 和.匹配BigDecimal要求,但如果你有机会得到"123,456.789",你就不能再使用它了。 -
@AxelH 这会起作用,但文本字段也应该始终显示发布的十进制格式。我也想过这个解决方案,但我无法让它工作,因为我必须将所有内容更改为正常的 JTextFields,然后许多方法无法按预期工作
-
如回答 cmets 中所述,您可能需要关注此guide on formatted textfield。这可能会帮助你
标签: java number-formatting decimalformat