【问题标题】:Java NumberFormat ignoring comma in US locale ?Java NumberFormat 忽略美国语言环境中的逗号?
【发布时间】:2013-03-26 09:50:55
【问题描述】:

我不理解 NumberFormat 中的某些内容,在美国语言环境中,假设将逗号 (",") 视为组分隔符 - 表示千位。

为什么它会忽略此语言环境不正确位置的逗号?

NumberFormat format = DecimalFormat.getInstance(Locale.US); 
System.out.println(format.parse("5,500").longValue()); //5500
System.out.println(format.parse("550,0").longValue()); //5500
System.out.println(format.parse("5500,").longValue()); //5500

如何根据语言环境将 String 解析为 Long 的任何其他想法(假设输入“,” 在不正确的区域设置应该失败)?

【问题讨论】:

  • 你说的 incorrect place 是什么意思?您示例中的所有陈述都是有效的。
  • 试试format.setGroupingUsed(true)。有区别吗?
  • @Puce:对于Locale.US,默认为true
  • @Puce,这不相关。使用解析器,但也使用 setGroupingSize(int)。即使您设置了模式“#,#00.0#”,摸索分隔符也不是格式验证的一部分,我将接受上述所有值。
  • 您在哪里读到“在美国语言环境中,假设将逗号 (",") 视为组分隔符 - 数以千计”

标签: java localization locale number-formatting


【解决方案1】:

正如 javadev 所提到的, parse 方法似乎忽略了千位分隔符。如果你想要严格解析,我想你必须自己实现一个解析方法(使用 NumberFormat/DecimalFormat 的信息)。

【讨论】:

    【解决方案2】:

    逗号是分组分隔符的占位符,句点是小数分隔符的占位符。

    NumberFormat format = DecimalFormat.getInstance(Locale.US); 
    System.out.println(format.parse("5.500").longValue()); //5
    System.out.println(format.parse("55.00").longValue()); //55
    System.out.println(format.parse("550.0").longValue()); //550
    

    逗号被忽略,就像从演示文稿开始一样。用于数千的合约很常见,但在解析过程中没有任何表示。这就是为什么它被称为分组分隔符而不是千分隔符。你可以有类似5,5.0,0, 的东西,它仍然有效。

    数字的分组方式可能不同,有时是 3 位,有时是 2 位或组合。

    从逻辑上讲,如果它只是用于简化人类阅读的分隔符。他的位置不会改变所呈现数字的值,因此可以省略。


    Oracle 实现的java.text.DecimalFormat 类分析表明分组字符被忽略。

    1526  // Ignore grouping characters, if we are using them, but
    1527  // require that they be followed by a digit.  Otherwise
    1528  // we backup and reprocess them.
    

    更多信息请访问Formatting Numeric Print Output

    【讨论】:

    • 他在问题中说明了这一点,我认为如果逗号位于错误的位置,他希望解析失败。
    • 他不想这样,他想知道什么是不倒下的。我对此添加了一些评论。
    • 正如 Keppil 所说,如果分组不正确(取决于语言环境),我希望它失败 - 如果可能的话
    • 您正在使用的类DecimalFormat 不能这样做。您可以使用正则表达式来验证输入。
    【解决方案3】:

    由于逗号是美国语言环境中千位的分隔符,因此在放置错误时会被忽略。 所有这些输出都将打印 5500。

    【讨论】:

    • 他在问题中说明了这一点,我认为如果逗号位于错误的位置,他希望解析失败。
    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多