[英]How to get the same value as the user is seeing from a JFormattedTextField?
我正在使用NumberFormatter
和JFormattedTextField
,但.getValue()
不会返回与用户看到的值相同的值。
我认为输入字符串是使用NumberFormats parse-method解析的,我从NumberFormat.getNumberInstance();
得到Numberformat NumberFormat.getNumberInstance();
与实际的Locale。 所以我认为我不能轻易扩展它并编写自己的解析方法?
例如 ,如果用户键入1234.487
则getValue()
将返回: 1234.487
但将显示用户1,234.49
另一个例子 ,使用NumberFormat.getCurrencyInstance();
。 用户1234.487
, getValue()
将返回1234.487
但用户将显示$1,234.49
相反 ,如果Formatter无法在不进行舍入的情况下格式化值,则需要生成ParseException。 同样的事情,如果用户键入4.35b6
,默认情况下格式化程序将显示4.35
,值将为4.35
,但我想要一个ParseException,因为用户键入了无效值。
这是我尝试过的代码:
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
final JFormattedTextField ftf = new JFormattedTextField(nf);
ftf.setValue(new BigDecimal("1234.50"));
// Print the value from ftf
final JTextField txt = new JTextField(12);
txt.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
txt.setText(ftf.getValue().toString());
}
});
如何获得与用户看到的相同的价值?
您应该扩展NumberFormatter
而不是NumberFormat
并覆盖stringToValue
以便它验证解析字符串时您返回原始值:
class StrictNumberFormatter extends javax.swing.text.NumberFormatter {
@Override
public Object stringToValue(String text) throws ParseException {
Object parsedValue = super.stringToValue(text);
String expectedText = super.valueToString(parsedValue);
if (! super.stringToValue(expectedText).equals(parsedValue)) {
throw new ParseException("Rounding occurred", 0);
}
return parsedValue;
}
public StrictNumberFormatter(NumberFormat nf) {
super(nf);
}
}
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
JFormattedTextField.AbstractFormatter formatter = new StrictNumberFormatter(nf);
final JFormattedTextField ftf = new JFormattedTextField(formatter);
ftf.setValue(new BigDecimal("1234.50"));
如果舍入前后的值不匹配,则此格式化程序将拒绝新文本。
注意:这会比较值 ,而不是字符串。 它可以容忍更改,例如删除分组字符( "$1,000"
=> "$1000"
)和尾随零( "$1.20"
=> "$1.2"
)。 基本上,如果NumberFormat
返回相同的值,那么它是可以接受的。 但是, NumberFormat
施加的任何限制仍然适用,例如,您不得删除货币符号或插入前导空格等。
尝试这个:
txt.setText(ftf.getFormatter().valueToString(ftf.getValue()));
您还必须处理valueToString
方法抛出的java.text.ParseException
。
编辑:格式化程序可以设置为完全禁止无效条目,这可能会有所帮助:
((DefaultFormatter)ftf.getFormatter()).setAllowsInvalid( false );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.