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<Double>
并将它与UnaryOperator<TextFormatter.Change>
一起使用以仅接受双数字:
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 时如何禁用声音?