JavaFX TextArea 接受负小数

Posted

技术标签:

【中文标题】JavaFX TextArea 接受负小数【英文标题】:JavaFX TextArea accept negative decimals 【发布时间】:2020-05-21 05:52:24 【问题描述】:

我正在创建一个自定义 TextArea,它在用户写作时接受负小数。

这是我在网上找到的十进制文本区域

public DecimalTextField() 

    super();

    UnaryOperator<Change> filter = new UnaryOperator<TextFormatter.Change>() 

        @Override
        public TextFormatter.Change apply(TextFormatter.Change t) 

            if (t.isReplaced()) 
                if(t.getText().matches("[^0-9]"))
                    t.setText(t.getControlText().substring(t.getRangeStart(), t.getRangeEnd()));


            if (t.isAdded()) 
                if (t.getControlText().contains(".")) 
                    if (t.getText().matches("[^0-9]")) 
                        t.setText("");
                    
                 else if (t.getText().matches("[^0-9.]")) 
                    t.setText("");
                
            

            return t;
        
    ;

    this.setTextFormatter(new TextFormatter<>(filter));


现在我需要它在开始时接受一个“-”,但我认为它并不像看起来那么简单。

【问题讨论】:

使用 NumberFormat 来检查输入是否有效 .. 【参考方案1】:

使用这个answer,创建一个自定义StringConverter&lt;Double&gt; 并将它与UnaryOperator&lt;TextFormatter.Change&gt; 一起使用以仅接受双数字:

NumberFormat numberFormat = NumberFormat.getNumberInstance(); // you can set a locale here
UnaryOperator<TextFormatter.Change> filter = change -> 
    String controlNewText = change.getControlNewText();
    if ("-".equals(controlNewText)) 
        return change;
     else 
        try 
            numberFormat.parse(controlNewText);
            return change;
         catch (ParseException | NullPointerException ignored) 
            return null;
        
    
;
StringConverter<Double> converter = new StringConverter<Double>() 
    @Override
    public Double fromString(String s) 
        try 
            return numberFormat.parse(s).doubleValue();
         catch (ParseException ignored) 
            return 0.0;
        
    
    @Override
    public String toString(Double d) 
        return numberFormat.format(d);
    
;
this.setTextFormatter(new TextFormatter<>(converter, 0.0, filter));

更新:答案是更新为使用NumberFormat 而不是正则表达式Pattern,以避免在使用不同的Locale 时发生问题。

【讨论】:

最好不要使用手动模式匹配 - 这会因不同的语言环境而中断。相反,使用适当的 NumberFormat @kleopatra,你是对的。当与不同的语言环境一起使用时,该实现可能会导致问题。我更新了我的答案以使用NumberFormat。感谢您的来信。

以上是关于JavaFX TextArea 接受负小数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 setText 之后滚动 JavaFX TextArea

在 javafx.scene.control.TextArea 中按 ALT ENTER 时如何禁用声音?

“textarea”中的 JavaFX 8 计数行

JavaFX:在进入 TextArea 时将插入符号/光标放在 TextArea 的末尾

JavaFX - TextArea 的掩码文本

带滚动条的只读 TextArea [JavaFx]