однажды я написал этот код для форматирования ввода 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
, только левая часть будет соответствовать, поэтому он не может получить.50
. У меня нет документации (пока), чтобы написать ответ об этом - person AxelH   schedule 03.05.2017"123456.789"
или"123456,789"
, поэтому только десятичный разделитель, поэтому я просто заменяю,
на.
, чтобы соответствовать требованиямBigDecimal
, но если есть шанс, что вы получите"123,456.789"
, вы больше не можете его использовать. - person AxelH   schedule 03.05.2017