【问题标题】:Best way to convert String to Integer or int将 String 转换为 Integer 或 int 的最佳方法
【发布时间】:2015-08-07 14:13:05
【问题描述】:

这可能以前问过太多次了,但是...

String str = "74.0";

假设我有"74.05",我只需要74。以下是我的一些方法..

Integer.parseInt(str); //would result to java.lang.NumberFormatException
(int) Double.parseDouble(str); //working
new BigDecimal(str).intValue(); //I like this

我想将此字符串(str) 转换为intInteger,最好的方法是什么?

【问题讨论】:

  • 如果你有74.90,你还想要74吗?
  • 是的,只有 74。我认为四舍五入会导致另一个问题
  • @JonathanDrapeau 如果字符串有.,则第二个链接答案将导致java.lang.NumberFormatException

标签: java


【解决方案1】:

java.lang.NumberFormatException 是因为您试图将 double 文字转换为 int 类型。

没有最好的方法,只有使用

Double.parseDouble("74.05");

而不是

Double.valueOf("74.05");

取决于您需要 double 原始类型或 Double 对象类型。

如果你需要一个整数类型,你可以像这样对双精度值进行四舍五入:

Math.round(Double.parseDouble("74.05"));

或简单地转换 double 以仅获取整数部分

(int)Double.parseDouble("74.05")

new BigDecimal(str).intValue(); 肯定是最糟糕的选择,因为它会导致如 Oracle 文档中所述的意外结果(见粗体):

public int intValue()

将此 BigDecimal 转换为 int。这种转换类似于 Java™ 语言规范第 5.1.3 节中定义的从 double 到 short 的缩小原语转换:该 BigDecimal 的任何小数部分都将被丢弃,并且如果生成的“BigInteger”太大而无法放入一个 int,只返回低 32 位。 请注意,此转换可能会丢失有关此 BigDecimal 值的整体大小和精度的信息,并返回带有相反符号的结果


与问题无关,当您需要从 int 值实例化 Integer 时,有时会有一种更快的方法。 来自java.lang.Integerclass 文档:

public static Integer valueOf(int i)

返回一个表示指定 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用此方法而不是构造函数 Integer(int),因为此方法可能会通过缓存频繁请求的值来显着提高空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并可能缓存此范围之外的其他值。

【讨论】:

  • 任何太大而无法放入int 的值都不会是好的,即使您不使用BigDecimal
  • "如果生成的 "BigInteger" 太大而无法放入 int,则只返回低 32 位" 我认为当你施放 Double 时也会发生同样的事情到int
  • @Jonathan Drapeau 和@yesterdaysfoe 你们都是对的,但我的意思是Integer.parseInt() 会引发异常,而new BigDecimal(str).intValue() 不会。无论如何,我错过了Double.parseDouble(str) 也不会引发异常返回+/-Infinity
【解决方案2】:

int x = (int) Double.parseDouble(s);

在 3 纳秒内运行,

int y = new BigDecimal(s).intValue();

在 8 纳秒内运行

【讨论】:

    【解决方案3】:

    一个真正有点非正统的解决方案是:

    Integer.parseInt(str.split("\\.")[0]);
    

    但它适用于“74.09”等字符串和“74”等字符串

    【讨论】:

    • 这可能有效,但我认为这将处理两个不同的字符串。由于 String 是不可变的,它会消耗更多的内存。
    【解决方案4】:

    怎么样

    整数 myNum = Integer.parseInt(str.substring(0, str.indexOf("."));

    因为 OP 明确不希望四舍五入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 2011-10-01
      • 2020-02-18
      • 2012-08-10
      • 2010-11-05
      • 2020-06-14
      • 2013-12-22
      • 1970-01-01
      相关资源
      最近更新 更多