DecimalFormat点和逗号为decimalSeparator

时间:2017-05-03 08:25:46

标签: java number-formatting decimalformat

我曾编写此代码来格式化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位数值的可能性

1 个答案:

答案 0 :(得分:2)

检查Oracle tutorial时,您可以找到:

  • 格式化可以更改格式符号,但
  • 对于解析没有这样的事情。

这很有意义:你只是在问“我希望用户能够使用各种不一致的数据;代码应该神奇地将其转化为用户的意思”。

改善用户体验的一种方法:而不是使用带格式的文本字段;您只需允许用户输入字符串即可。然后你编写验证器,允许“神奇”发生。

换句话说:如果你想要“4,59”和“4.59”同样的结果,那么你需要为此编写代码。这可能就像使用indexOf()来确定是否“。”一样简单。或“,”出现在传入的字符串中( ONCE );然后尝试使用不同模式对每个案例使用“格式化”解析。如果您决定进入深渊的陡峭路线,请开始阅读InputVerifiers here

但当然:这可能会变得复杂;因为如上所述;你基本上允许用户输入任何数据;并希望猜测他的意思。

我个人的两分钱:在该文本字段周围放了很多警告/示例;并允许完全一个基于区域设置的输入。当他违反时,用手指敲打。