【发布时间】:2016-02-12 19:02:53
【问题描述】:
我正在尝试制作一些 JTextField 来仅验证货币 ($xxx.xx) 这样的双数字,我使用 DocumentFilter 编写了一个类来验证字符的模式和大小,但我无法实现的是用户可以输入多个点。
这是我的代码示例:
private class LimitCharactersFilter extends DocumentFilter {
private int limit;
private Pattern regex = Pattern.compile( "\\d*(\\.\\d{0,2})?");
private Matcher matcher;
public LimitCharactersFilter(int limit) {
this.limit = limit;
}
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
throws BadLocationException {
String fullText = fb.getDocument().getText(0, fb.getDocument().getLength()) + string;
matcher = regex.matcher(fullText);
if((fullText.length()) <= limit && matcher.matches()){
fb.insertString(offset, string, attr);
}else{
Toolkit.getDefaultToolkit().beep();
}
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
throws BadLocationException {
String fullText = fb.getDocument().getText(0, fb.getDocument().getLength()) + text;
matcher = regex.matcher(fullText);
matcher = regex.matcher(text);
if((fullText.length()) <= limit && matcher.matches()){
fb.replace(offset,length, text, attrs);
}else{
Toolkit.getDefaultToolkit().beep();
}
}
}
验证字符的限制效果很好,但如果已经有一个点,我想限制用户输入超过两位数。
希望有人可以帮助我。
【问题讨论】:
-
试试
\\d*\\.?\\d{0,2},但它只适用于实时输入。 -
@WiktorStribiżew 非常感谢!,这工作得很好,是的,我没有解释得太清楚,但我希望它用于实时输入,你的解决方案对我很有用.
-
创建允许输入货币的文本字段的正确方法是使用
new JFormattedTextField(NumberFormat.getCurrencyInstance())。
标签: java regex swing documentfilter