【问题标题】:The NumberFormatter function I made for JFormattedTextField, doesn't allow typing decimal numbers我为 JFormattedTextField 制作的 NumberFormatter 函数不允许输入十进制数字
【发布时间】:2017-05-16 20:05:10
【问题描述】:

为了将用户的输入限制在特定的数字范围内,我创建了这个函数:

public static final Locale GR=new Locale("el", "GR");

public static NumberFormatter getMyNumberFormatter(){
    NumberFormatter formatter = new NumberFormatter(NumberFormat.getInstance(GR));
    formatter.setValueClass(Double.class);
    formatter.setAllowsInvalid(false);
    formatter.setCommitsOnValidEdit(true);
    formatter.setMinimum(0.0);
    formatter.setMaximum(10000000.0);
    DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(GR);
    df.setGroupingUsed(true);
    formatter.setFormat(df);
    return formatter;
}

我将此格式化程序应用于 JFormatedTextfield,但它适用于整数值。我希望用户能够键入从 0.0 到 10000000.0 的浮点数值,但当前的格式化程序只允许整数。自动分组工作完美。有什么建议吗?

【问题讨论】:

  • 您是否需要输入 逗号decimal mark - 希腊语?
  • 您是否尝试过 BigDecimal 而不是 Double 作为值类?
  • @JoopEggen 语言环境设置为希腊语 (new Locale("el", "GR")),所以逗号作为小数点应该不成问题。以防万一,我使用美国语言环境('.' 表示小数点)对其进行了测试,并遇到了同样的问题。
  • @dpr 当我将 setValueClass(Double.class) 更改为 setValueClass(BigDecimal.class) 时,格式化程序不允许输入任何字符(出于某种奇怪的原因)。如果我使用 Float.class,也会发生同样的事情。
  • 对不起,那就像答案中的new NumberFormatter(new DecimalFormat("0.0###"))

标签: java decimalformat jformattedtextfield numberformatter


【解决方案1】:

我记得JFormattedTextField 使用起来很痛苦。

根据 javadoc 的以下部分,我假设 DecimalFormat 不允许只有小数点的数字:

如果您要允许用户输入十进制值,您应该强制 DecimalFormat 至少包含一个小数 (#.0###),或者允许该值无效setAllowsInvalid(true)。否则用户可能无法输入十进制值。

你也可以尝试添加

df.setDecimalSeparatorAlwaysShown(true);

注意:JFTF 是使用一种 NumberFormat 创建的,后来又设置了一个新的格式,这有点令人困惑。更直接(未测试):

DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(GR);
df.setGroupingUsed(true);
df.setDecimalSeparatorAlwaysShown(true);
NumberFormatter formatter = new NumberFormatter(df);
...

或者只是

NumberFormatter formatter = new NumberFormatter();
...
formatter.setFormat(df);

建议(比使用 JFTF 更好的 IMO):

扩展DocumentFilter 并将其设置为新PlainDocument 的过滤器。使用使用该文档的 JTextField。

【讨论】:

  • 当我添加df.setDecimalSeparatorAlwaysShown(true)df.applyPattern("###,##0.00") 时问题解决了。当我添加第一个时,格式化程序允许除 0(零)之外的所有数字,但是当我应用一个也解决了的模式时。非常感谢,是的,JFormatedTextField 确实很痛苦。
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多