Javafx Форматирование десятичного числа текстовое поле - PullRequest
0 голосов
/ 19 февраля 2020

У меня проблема с форматированием десятичного числа валюты в TextField. Я установил TextFormatter с классом DecimalFormatter, который расширяет StringConverter, который преобразует BigDecimal в String и наоборот. Когда я должен изменить значение, если удалить все данные и вставить новое завершенное значение, это работает, но если мне нужно добавить / изменить часть значения, например, 13.00 в 13.10, изменение не применяется и повторно предлагает старое значение 13.00. .
Как я могу это решить?
Спасибо

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

1 Ответ

0 голосов
/ 19 февраля 2020

Я намеревался управлять суммами с десятичными знаками, разделенными запятой в текстовом поле. Я добавил фильтр, чтобы разрешить только двойные суммы. Полный код:


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