【问题标题】:Convert String (representing decimal number) to long将String(表示十进制数)转换为long
【发布时间】:2012-10-16 21:22:57
【问题描述】:

我用谷歌搜索了一下,但找不到找到解决方案的示例。这是我的问题:

String s = "100.000";
long l = Long.parseLong(s);

尝试将字符串 's' 解析为 long 的第二行代码抛出 NumberFormatException

有没有办法解决这个问题?问题是表示十进制数的字符串实际上是以毫秒为单位的时间,所以我不能将它转换为 int 因为我失去了精度。

【问题讨论】:

  • 那个点代表什么?是 0 还是小数点之间的分隔符?

标签: java string parsing converter long-integer


【解决方案1】:

您可以使用 BigDecimal 来处理双重解析(没有使用 Double.parseDouble() 可能会导致精度损失的风险):

BigDecimal bd = new BigDecimal(s);
long value = bd.longValue();

【讨论】:

    【解决方案2】:

    我不知道你的 100.000 等于 100 还是 100 000 我认为我可以向您推荐的最安全的解决方案是:

    NumberFormat nf = NumberFormat.getInstance();
    Number number = nf.parse("100.000");
    long l = number.longValue();
    

    【讨论】:

      【解决方案3】:

      'long' 是整数类型,因此 String 解析由于小数点而被拒绝。选择更合适的类型可能会有所帮助,例如双精度型。

      【讨论】:

      • 是的,我意识到这可能是欧洲符号有点晚。我可能会删除这个答案,因为似乎其他人已经涵盖了所有可能的解决方案。
      【解决方案4】:

      只需删除数千个的所有占位符,点...

      s.replaceAll(".","");
      

      【讨论】:

      • 这将导致错误的数字,100.00 将是 10000
      【解决方案5】:

      你应该使用 NumberFormat 来解析值

      【讨论】:

        【解决方案6】:

        我们可以使用正则表达式来去除小数部分。然后使用 parseLong

        Long.parseLong(data.replaceAll("\..*", ""));

        【讨论】:

          【解决方案7】:

          如果你不想放松压力,那么你应该使用multiplication

              BigDecimal bigDecimal = new BigDecimal("100.111");
              long l = (long) (bigDecimal.doubleValue() * 1000);<--Multiply by 1000 as it
                                                                   is miliseconds
              System.out.println(l);
          

          输出:

          100111
          

          【讨论】:

          • 这是一个非常糟糕的主意。双打不是无损的!遵循此建议可能会导致数据损坏。
          猜你喜欢
          • 2015-12-18
          • 1970-01-01
          • 2020-03-14
          • 2018-02-17
          • 1970-01-01
          • 2013-10-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-31
          相关资源
          最近更新 更多