Вы проверяете неверную строку в вашем DocumentFilter.
Вам следует проверять не текстовую строку, а строку, построенную из текста и документа, полученных из параметра FilterBypass, поскольку это строка, которую вы хотите увидеть, если она удовлетворяет критериям.Например, не это:
public void insertString(DocumentFilter.FilterBypass fb, int offset,
String text, AttributeSet attr) throws BadLocationException
{
if(!containsOnlyNumbers(text)) return;
fb.insertString(offset, text, attr);
}
public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
String text, AttributeSet attr) throws BadLocationException
{
if(!containsOnlyNumbers(text)) return;
fb.replace(offset, length, text, attr);
}
А скорее это:
private class NumberOnlyFilter extends DocumentFilter {
public void insertString(DocumentFilter.FilterBypass fb, int offset,
String text, AttributeSet attr) throws BadLocationException {
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.insert(offset, text);
if (!containsOnlyNumbers(sb.toString()))
return;
fb.insertString(offset, text, attr);
}
public void replace(DocumentFilter.FilterBypass fb, int offset,
int length, String text, AttributeSet attr)
throws BadLocationException {
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.replace(offset, offset + length, text);
if (!containsOnlyNumbers(sb.toString()))
return;
fb.replace(offset, length, text, attr);
}
Вам необходимо будет внести изменения в метод containsOnlyNumbers, чтобы учесть эти изменения.
Редактировать 1
И это легко сделать с помощью регулярного выражения toto:
private boolean containsOnlyNumbers(String text) {
Pattern pattern = Pattern.compile("\\d*(\\.\\d{0,2})?");
Matcher matcher = pattern.matcher(text);
boolean isMatch = matcher.matches();
return isMatch;
}