我曾编写此代码来格式化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
或{ {1}}。我认为这是我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位数值的可能性
答案 0 :(得分:2)
检查Oracle tutorial时,您可以找到:
这很有意义:你只是在问“我希望用户能够使用各种不一致的数据;代码应该神奇地将其转化为用户的意思”。
改善用户体验的一种方法:而不是使用带格式的文本字段;您只需允许用户输入字符串即可。然后你编写验证器,允许“神奇”发生。
换句话说:如果你想要“4,59”和“4.59”同样的结果,那么你需要为此编写代码。这可能就像使用indexOf()
来确定是否“。”一样简单。或“,”出现在传入的字符串中( ONCE );然后尝试使用不同模式对每个案例使用“格式化”解析。如果您决定进入深渊的陡峭路线,请开始阅读InputVerifiers
here。
但当然:这可能会变得复杂;因为如上所述;你基本上允许用户输入任何数据;并希望猜测他的意思。
我个人的两分钱:在该文本字段周围放了很多警告/示例;并允许完全一个基于区域设置的输入。当他违反时,用手指敲打。