【问题标题】:How to parse numbers more strict than what NumberFormat does in Java?如何解析比 Java 中的 NumberFormat 更严格的数字?
【发布时间】:2012-01-15 00:36:53
【问题描述】:

我正在验证来自表单的用户输入。

我用NumberFormat 解析输入,但它是邪恶的并且允许几乎任何东西。有什么方法可以更严格地解析数字吗?

例如对于整数,我不想允许这三个输入,但Numberformat 允许所有这些输入:

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setParseIntegerOnly(true);

Number numberA = nf.parse("99.731");    // 99 (not what the user expect)
Number numberB = nf.parse("99s.231");   // 99 (invalid)
Number numberC = nf.parse("9g9");       // 9  (invalid)

System.out.println(numberA.toString());
System.out.println(numberB.toString());
System.out.println(numberC.toString());

【问题讨论】:

  • 如何将其转换为字符串,然后遍历字符串并只允许字符“0”..“9”?或者只是去 getIntegerInstance();
  • @DorinDuminica: getIntegerInstance() 给出相同的结果。
  • 为什么不使用Integer.parseInt(String)
  • 这个问题不清楚。您没有准确说明应该允许哪些格式......或者您是否要接受“区域设置敏感”整数格式。

标签: java validation number-formatting


【解决方案1】:

也许这会有所帮助:

String value = "number_to_be_parsed".trim();
NumberFormat formatter = NumberFormat.getNumberInstance();
ParsePosition pos = new ParsePosition(0);
Number parsed = formatter.parse(value, pos);
if (pos.getIndex() != value.length() || pos.getErrorIndex() != -1) {
    throw new RuntimeException("my error description");
}

(感谢Strict number parsing at mynetgear.net

【讨论】:

  • 谢谢 - 这是唯一真正解决问题的答案!其他不考虑本地(如十进制分隔符)。只是想知道为什么在默认实现中这不是(至少是可配置的):(
【解决方案2】:

有很多方法可以做到这一点:

【讨论】:

    【解决方案3】:

    Integer.parseInt(String) 将在您的所有示例中引发 NumberFormatException。我不确定这是否是您正在寻找的,但它绝对是“更严格”。

    【讨论】:

      【解决方案4】:

      将 DecimalFormat 与格式模式字符串一起使用。

      【讨论】:

      • DecimalFormat 有同样的问题。或者你有例子吗?
      【解决方案5】:

      看看 DecimalFormat 是 NumberFormat http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html 的子类

      DecimalFormat myFormatter = new DecimalFormat("###.###");

      【讨论】:

      • 这给出了同样邪恶的结果。
      【解决方案6】:

      如果您担心验证,我不会使用 java 的数字格式例程,尤其是使用语言环境设置。

          Locale numberLocale = new Locale(“es”,”ES");
          NumberFormat nf = NumberFormat.getInstance(numberLocale);
          ParsePosition pos = new ParsePosition(0);
          Number test = nf.parse("0.2", pos);
      

      您会认为这里会出现问题,但没有.. test 等于 2,pos 的索引为 3,错误索引为 -1。

      【讨论】:

        【解决方案7】:

        我放弃了编写自己的验证类,而选择了NEBULA WIDGETS FormattedText

        它是通过 SWT 小部件 API 编写的,但您可以轻松地修改 NumberFormatter class

        【讨论】:

          猜你喜欢
          • 2015-08-27
          • 2012-10-16
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-27
          相关资源
          最近更新 更多