【发布时间】:2021-10-12 07:19:30
【问题描述】:
我正在使用 TextFomater 将我的 TextField 作为动态货币文本字段,使用以下代码:
public class MoneyTextFieldOperator implements UnaryOperator<TextFormatter.Change>
{
final char seperatorChar = '.';
final Pattern p;
int length;
public MoneyTextFieldOperator(int length) {
this.length=length;
this.p = Pattern.compile("[0-9. ]*");
}
@Override
public TextFormatter.Change apply(final TextFormatter.Change c) {
if (c.isContentChange() && c.getControlNewText().length() > length) {
return null;
}
else {
if (!c.isContentChange()) {
return c;
}
final String newText = c.getControlNewText();
if (newText.isEmpty()) {
return c;
}
if (!this.p.matcher(newText).matches()) {
return null;
}
final int suffixCount = c.getControlText().length() - c.getRangeEnd();
int digits = suffixCount - suffixCount / 4;
final StringBuilder sb = new StringBuilder();
if (digits % 3 == 0 && digits > 0 && suffixCount % 4 != 0) {
sb.append('.');
}
for (int i = c.getRangeStart() + c.getText().length() - 1; i >= 0; --i) {
final char letter = newText.charAt(i);
if (Character.isDigit(letter)) {
sb.append(letter);
if (++digits % 3 == 0) {
System.out.println("digits : "+digits);
sb.append('.');
}
}
}
if (digits % 3 == 0) {
sb.deleteCharAt(sb.length() - 1);
}
sb.reverse();
final int length = sb.length();
c.setRange(0, c.getRangeEnd());
c.setText(sb.toString());
c.setCaretPosition(length);
c.setAnchor(length);
return c;
}}
并称其如下:
montantTextField.setTextFormatter(new TextFormatter(new MoneyTextFieldOperator(10)));
问题是它只对整数有效,我想让它现在对十进制数字有效,所以当用户输入 254648,32 它将其转换为 254.648,32
【问题讨论】:
-
不要进行手动模式匹配 - 而是使用数字格式
-
@kleopatra 问题是我希望在用户输入(动态)时对其进行格式化
-
不会改变我的评论 :)
-
我刚用过,但不能正常工作:(,有什么完美使用方法的提示吗?
-
将您的解决方案发布为答案(并接受它),以便将来的读者轻松查看