javafx - Javafx 格式化十进制数字文本字段
问题描述
我在格式化货币十进制数字时遇到问题TextField
。我设置了一个扩展 aTextFormatter
的类,该类将 a转换为,反之亦然。当我应该更改值时,如果删除所有数据并插入一个新的完整值,它可以工作,但如果我必须添加/更改部分值,例如 13.10 中的 13.00,则不应用更改并重新提出旧值 13.00 .
我该如何解决?
谢谢DecimalFormatter
StringConverter
BigDecimal
String
public class DecimalFormatter extends StringConverter<BigDecimal> {
private NumberFormat numberFormat;
....
@Override
public String toString(BigDecimal value) {
if ( value == null )
value = new BigDecimal();
return numberFormat.format(value.doubleValue());
}
@Override
public BigDecimal fromString(String value) {
return new BigDecimal(value);
}
}
....
tfDecimal.setTextFormatter(new DecimalFormatter());
解决方案
我的意图是管理文本字段中用逗号分隔的小数位数。我添加了一个过滤器,只允许双倍数量。完整代码:
public class DecimalFormatter extends StringConverter {
private final NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.ITALY);
public DecimalFormatter(int fractionsLenght) {
numberFormat.setMaximumFractionDigits(fractionsLenght);
numberFormat.setMinimumFractionDigits(fractionsLenght);
}
public DecimalFormatter() {
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMinimumFractionDigits(2);
}
@Override
public String toString(BigDecimal value) {
if ( value == null )
value = new BigDecimal(0);
return numberFormat.format(value.doubleValue());
}
@Override
public Decimal fromString(String value) {
value = value.replaceAll(",", ".");
return new BigDecimal(value);
}
}
public class DecimalFilter implements UnaryOperator {
private static final char DECIMAL_SEPARATOR = DecimalFormatSymbols.getInstance().getDecimalSeparator();
private Pattern DIGIT_PATTERN;
public DecimalFilter() {
DIGIT_PATTERN = Pattern.compile("-?\\d*(\\" + DECIMAL_SEPARATOR + "\\d{0,2})?");
}
public DecimalFilter(int fractionsLenght) {
DIGIT_PATTERN = Pattern.compile("-?\\d*(\\" + DECIMAL_SEPARATOR + "\\d{0," + fractionsLenght + "})?");
}
@Override
public Change apply(TextFormatter.Change aT) {
return DIGIT_PATTERN.matcher(aT.getText()).matches() ? aT : null;
}
}
tfDecimalValue.setTextFormatter(
new TextFormatter(new DecimalFormatter(), new BigDecimal(0), new DecimalFilter()));
推荐阅读
- reactjs - Stripe reactjs - 找不到元素上下文
- c - Pthreads-互斥锁但变量不会改变
- flutter - TextOverflow 在文本小部件颤振中不起作用
- java - 如何接受返回的二维数组
- vpn - Azure VPN P2S Azure AD认证连接问题:操作被用户取消
- web - 使用 web.config 从 url 中删除 .html 扩展名,仅适用于具有 .html 而不是主页的 url
- sql - 带有连接和 PostgreSQL 的二维表查询
- sql - SQL Server 过程 - 合并两个不重复的表 - 如果表 B 列 B = 1 则
- reactjs - 由于错误代码 ELIFCYCLE,在 rpm 运行命令后 React 项目无法构建
- python - Python 3 如何删除列表中的特定字符串并重置它