首页 > 解决方案 > Javafx 格式化十进制数字文本字段

问题描述

我在格式化货币十进制数字时遇到问题TextField。我设置了一个扩展 aTextFormatter的类,该类将 a转换为,反之亦然。当我应该更改值时,如果删除所有数据并插入一个新的完整值,它可以工作,但如果我必须添加/更改部分值,例如 13.10 中的 13.00,则不应用更改并重新提出旧值 13.00 . 我该如何解决? 谢谢DecimalFormatterStringConverterBigDecimalString

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());

标签: javafxtextfield

解决方案


我的意图是管理文本字段中用逗号分隔的小数位数。我添加了一个过滤器,只允许双倍数量。完整代码:


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()));

推荐阅读