当前位置: 首页 > 知识库问答 >
问题:

Javafx格式化十进制数字文本字段

公良俊楚
2023-03-14

TextField中设置货币小数格式时遇到问题。我用一个类DecimalFormatter来设置TextFormatter,这个类扩展了StringConverter,它将BigDecimal转换为String,反之亦然。当我应该更改值时,如果删除所有数据并插入一个新的完整值,它是有效的,但如果我必须添加/更改值的一部分,如13.10中的13.00,更改将不应用,并重新提出旧值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个答案

楚勇
2023-03-14

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


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()));
 类似资料:
  • 我正在使用DecimalFormats将双打格式化为字符串。然后这个字符串被集成到我的表示层中。 问题:我想保留所有的小数。示例:“12345678.123456789” 格式:#.#- 我可以用##########对于大小数点,但是如果小数点更长呢? 我发现我的小测试程序很有用,想和大家分享。 你能帮我显示所有小数吗? 这导致: 编辑:一位用户提到了一个相关的问题:如何很好地将浮点数格式化为字符

  • 问题内容: 我想将整数数字格式化为十六进制字符串。 打印,但我希望它作为。我怎么做? 问题答案: 试试这个

  • 问题内容: 我需要从随机整数(0-255)列表中创建一个十六进制数字字符串。每个十六进制数字应由两个字符表示:5-“ 05”,16-“ 10”等。 例: 我设法提出了: 但是,这看起来有点尴尬。有没有更简单的方法? 问题答案:

  • 我是android和java编程的新手,所以请原谅我,如果这是一个简单的问题。我的问题是在小数点后添加%。我会得到双倍的值,不知道小数点后有多少位数,我需要在小数点后转换为两位数,最后需要在最后的位置添加%。问题是,我将只格式化一次双倍值。我已经尝试过像这样DecimalFormat ("#.##%"), 但是小数点向前移动了两位数。请帮助我摆脱这个问题。 使用十进制格式(“#.##%”, 实际:

  • 如何转换“大”十六进制数(字符串格式): EC 851 A 69 B 8 ACD 843164 E 10 CFF 70 CF 9 E 86 DC 2 FEE 3 CF 6 F 374 B 43 C 854 E 3342 A 2 F 1 AC 3 E 30 C 741 CC 41 E 679 DF 6 D 07 CE 6 FA 3 A 66083 EC 9 B 8 C 8 BF 3 AF 05 D

  • 我正在使用模式"#0.00##"来格式化数字,它可以像预期的那样为大多数输入工作。但有时源号较小(即:6.84378E-05),并被转换为"0,0001"。 是否有可能仅使用科学符号格式化这些数字(不符合标准模式)?保持所有“正常”数字不变?用单一模式。 我必须只使用一个DecimalFormal模式,没有任何额外的代码。 编辑:为了更好地解释为什么我需要单精度格式:我使用的是一个外部库,只能定义