【问题标题】:how can I parse "30.0" or "30.00" to Integer?如何将“30.0”或“30.00”解析为整数?
【发布时间】:2011-06-19 03:41:00
【问题描述】:

我使用:

String str="300.0";
System.out.println(Integer.parseInt(str));

返回异常:

线程“main”java.lang.NumberFormatException 中的异常:对于输入字符串:“300.0”

如何将此字符串解析为 int?

感谢您的帮助:)

【问题讨论】:

  • 为什么?格式化为 30.0 或 30.00 的数据显然根本不是整数,而是实数。

标签: java


【解决方案1】:

你是这样做的:

String str = "300.0";
System.out.println((int) Double.parseDouble(str));

您得到NumberFormatException 的原因仅仅是字符串(“300.00”,它是一个浮点数)无法解析为整数。


值得一提的是,即使对于输入 "300.99",此解决方案也会打印 300要获得适当的舍入,您可以这样做

System.out.println(Math.round(Double.parseDouble("300.99")));  // prints 301

【讨论】:

    【解决方案2】:

    您可以使用Double.parseDouble() 方法首先将其转换为double,然后将double 转换为int,方法是将(int) 放在它前面。然后你会得到以下代码:

    String str="300.0";
    System.out.println((int)Double.parseDouble(str));
    

    【讨论】:

      【解决方案3】:

      我很惊讶没有人提到BigDecimal

      这确实是将十进制字符串转换为 int 的最佳方法。
      Josuha Bloch 建议在他的一个谜题中使用这种方法。

      这是在Ideone.com上运行的示例

      class Test {
        public static void main(String args[]) {
          try {
              java.math.BigDecimal v1 = new java.math.BigDecimal("30.0");
              java.math.BigDecimal v2 = new java.math.BigDecimal("30.00");            
            System.out.println("V1: " + v1.intValue() + " V2: " + v2.intValue());
          } catch(NumberFormatException npe) {
            System.err.println("Wrong format on number");
          }
        }
      }
      

      【讨论】:

      • 嗯,你觉得comes closest to the correct answer是哪一个?
      • @aioobe:不错的收获。也许这就是谜题的全部意义所在。我只是从脑海中回忆起来:-)
      • 我实际上已经提交了与这种行为相关的a bug report。如果您同意它令人困惑,您可以投票支持它;)
      • 如果你想确保解析后的字符串没有小数部分,我建议使用intValueExact
      • @Jörn Horstmann:除非我在尝试时得到java.lang.ArithmeticException: Overflow at java.math.BigDecimal.intValueExact(BigDecimal.java:3031)
      【解决方案4】:

      Integer.parseInt() 必须 接受一个整数字符串(即没有小数点,即使该数字等于整数。你到达那里的例外基本上是说“你”我告诉我这个数字是一个整数,但是这个字符串不是一个有效的整数格式!”

      如果数字包含小数部分,那么您需要使用Double.parseDouble(),它将返回一个双精度原语。但是,由于您对小数部分不感兴趣,您可以通过将 double 转换为 int 来安全地删除它:

      int num = (int)Double.parseDouble(str);
      

      但是请注意,这只会删除小数部分,根本不会将数字四舍五入。因此,将 1.2、1.8 或 1.999999 转换为 int 都会给您 1。如果您想对返回的数字进行四舍五入,请使用 Math.round() 而不仅仅是转换为 int。

      【讨论】:

        【解决方案5】:

        您应该先将其解析为double,然后再将其转换为int

        String str="300.0";
        System.out.println((int)(Double.parseDouble(str)));
        

        你需要抓住NumberFormatExceptions。

        编辑:感谢 Joachim Sauer 的更正。

        【讨论】:

        • 几乎正确,他应该解析为double,然后转换为intDouble 不能转换为 Integer
        • 不,您不需要将 NumberFormatException 捕获为 1) "300.0" 会解析得很好,2) 它不是已检查异常。
        • @aioobe:我假设该字符串不会一直为“300.0”,并且可能包含无效值。
        猜你喜欢
        • 2013-04-06
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 2019-04-22
        • 1970-01-01
        相关资源
        最近更新 更多