题 如何在Java中将String转换为int?


我怎样才能转换一个 String 到了 int 在Java?

我的字符串只包含数字,我想返回它代表的数字。

例如,给定字符串 "1234" 结果应该是数字 1234


2520
2018-04-07 18:27


起源




答案:


String myString = "1234";
int foo = Integer.parseInt(myString);

Java文档 了解更多信息。


3558
2018-04-07 18:29



这将抛出 NumberFormatException 如果输入不是有效数字。 - Francesco Menzani
除了捕获NumberFormatException之外,用户还应该注意它们传入的字符串的长度;如果它们足够长以溢出整数,他们可能想要考虑使用Long :: parseLong。 - Allison
@Allison特别是如果在PostgreSQL自动递增的主键字段中使用BIGINT字段。使用时间更长,更安全 - Letholdrus
您可以先检查字符串是否为数字: stackoverflow.com/questions/1102891/... - JPRLCol
当string不是基数10中的可解析整数时,此方法也会抛出异常。使用重载方法在其他基础中工作。例如Integer.parseInt(“1001”,8);基地8。 资源。 - lokesh


例如,有两种方法:

Integer x = Integer.valueOf(str);
// or
int y = Integer.parseInt(str);

这些方法之间略有不同:

  • valueOf 返回一个新的或缓存的实例 java.lang.Integer
  • parseInt 返回原语 int

所有情况都是如此: Short.valueOf/parseShortLong.valueOf/parseLong


588
2018-04-07 18:36



有关两种方法之间的差异,请参阅 这个问题 - hertzsprung
valueOf 方法就是 return valueOf(parseInt(string)); - Paul Verest


好吧,需要考虑的一个非常重要的一点是Integer解析器抛出NumberFormatException,如中所述 的Javadoc

int foo;
String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exception
String StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exception
try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot);
} catch (NumberFormatException e) {
      //Will Throw exception!
      //do something! anything to handle the exception.
}

try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);
} catch (NumberFormatException e) {
      //No problem this time, but still it is good practice to care about exceptions.
      //Never trust user input :)
      //Do something! Anything to handle the exception.
}

尝试从拆分参数中获取整数值或动态解析某些内容时,处理此异常非常重要。


215
2018-04-30 06:54



我怎么解析“26263Hello”?在这种情况下我想提取26263 - user463035818
@ user463035818 - 见 docs.oracle.com/javase/8/docs/api/java/util/regex/...  - 定期表达模式 "([0-9]+)" 将“捕获”一个或多个数字1到9的第一个序列。看着那(这 Matcher 该包中的类。 - Mark Stewart


手动完成:

public static int strToInt( String str ){
    int i = 0;
    int num = 0;
    boolean isNeg = false;

    //Check for negative sign; if it's there, set the isNeg flag
    if (str.charAt(0) == '-') {
        isNeg = true;
        i = 1;
    }

    //Process each character of the string;
    while( i < str.length()) {
        num *= 10;
        num += str.charAt(i++) - '0'; //Minus the ASCII code of '0' to get the value of the charAt(i++).
    }

    if (isNeg)
        num = -num;
    return num;
}

72
2017-09-11 02:08



如果输入大于2 ^ 32怎么办?如果输入包含非数字字符怎么办? - yohm
如果不是以前,程序员必须学习加入劳动力队伍的事情之一,永远不会重新发明轮子。这可能是一个有趣的练习,但如果你在商业环境中做这种事情,不要指望你的代码通过代码审查。 - Dawood ibn Kareem
@yohm那些是特例;你可以处理长期和一些正则表达式;但是,到那时你可以使用parseInt。 - Billz
-1对不起,但这是一个非常差的算法,有很多限制,没有错误处理,还有一些奇怪的异常(例如“”给出异常,“ - ”将产生0,“+”产生-5)。为什么有人会选择这个 Integer.parseInt(s)? - 我认为这是一个面试问题,但是a)并不意味着你这样做(这就是提问者所说的),而b)这个答案无论如何都是一个非常糟糕的例子。 - SusanW
我想这个答案适合好奇的家伙...... - Timur Milovanov


目前我正在为大学做作业,在那里我不能使用某些表达式,例如上面的表达式,通过查看ASCII表,我设法做到了。这是一个复杂得多的代码,但它可以帮助像我一样受限制的其他代码。

首先要做的是接收输入,在这种情况下,是一串数字;我会叫它 String number在这种情况下,我将使用数字12来举例说明 String number = "12";

另一个限制是我不能使用重复循环,因此,a for 循环(本来应该是完美的)也不能使用。这限制了我们一点,但话说回来,这就是目标。由于我只需要两位数(取最后两位数字),一个简单的 charAt解决了它:

 // Obtaining the integer values of the char 1 and 2 in ASCII
 int semilastdigitASCII = number.charAt(number.length()-2);
 int lastdigitASCII = number.charAt(number.length()-1);

有了代码,我们只需要查看表格,并进行必要的调整:

 double semilastdigit = semilastdigitASCII - 48;  //A quick look, and -48 is the key
 double lastdigit = lastdigitASCII - 48;

现在,为什么加倍?好吧,因为一个非常“奇怪”的步骤。目前我们有两个双打,1和2,但是我们需要把它变成12,我们可以做任何数学运算。

我们将后者(lastdigit)除以10 2/10 = 0.2 (因此为什么加倍)像这样:

 lastdigit = lastdigit/10;

这只是玩数字。我们把最后一位数字变成了小数。但现在,看看会发生什么:

 double jointdigits = semilastdigit + lastdigit; // 1.0 + 0.2 = 1.2

没有太多的数学,我们只是将数字与数字隔离。你看,因为我们只考虑0-9,除以10的倍数就像创建一个存储它的“盒子”(当你的一年级老师解释你是一个单位和一百个是什么时,请回想一下)。所以:

 int finalnumber = (int) (jointdigits*10); // Be sure to use parentheses "()"

你去吧考虑到以下限制,您将一个数字字符串(在本例中为两位数)转换为由这两个数字组成的整数:

  • 没有重复的循环
  • 没有像“parseInt”这样的“魔术”表达式

38
2018-03-20 23:51



使用double类型解析整数不仅是一个糟糕的想法。像0.2这样的值是浮点表示中的周期数,不能精确表示。尝试System.out.println(0.1 + 0.2)来看点 - 结果不会是0.3!最好坚持使用库代码,在这种情况下,Integer.parseInt()。 - ChrisB
目前尚不清楚这个答案试图解决什么样的问题,首先,为什么任何人都应该有你描述的限制,其次,为什么你必须看一个ASCII表,因为你可以简单地使用 '0' 对于角色而不是 48 而且永远不必费心去理解它的实际数值。第三,整个绕道而行 double 当你除以10时,数值毫无意义,只是随后乘以十。结果就是 semilastdigit * 10 + lastdigit 在小学里学到的,当引入十进制时...... - Holger
@Holger我在第一次开始编程时,以及在测试中必须编写(笔/纸)类似的交互时,个人受到了限制。这种情况并不常见,但它是一种易于理解的方法,虽然不是英里最有效的方法,但这种方法对小型项目来说效果不错。 SO.SE旨在帮助每个人,而不仅仅是少数人。我为那些开始学习如何创建伪算法并将其转换为算法而不是使用预制java表达式的人提供了另一种方法。虽然我确实忘记了'0'很酷 - Oak


另一种解决方案是使用 Apache Commons' NumberUtils:

int num = NumberUtils.toInt("1234");

Apache实用程序很好,因为如果字符串是无效的数字格式,则始终返回0。因此保存try catch块。

Apache NumberUtils API版本3.4


33
2017-08-27 12:07



解析无效数字时,很少需要使用0。 - wnoise
如果未设置对象上的int字段,则零是java用作默认值的值。所以在这方面它是有道理的。 - Ryboflavin
@Ryboflavin不,它没有。其中一个是明确定义的语言语义,另一个是例外 - etherous


Integer.decode

你也可以使用 public static Integer decode(String nm) throws NumberFormatException

它也适用于基数8和16:

// base 10
Integer.parseInt("12");     // 12 - int
Integer.valueOf("12");      // 12 - Integer
Integer.decode("12");       // 12 - Integer
// base 8
// 10 (0,1,...,7,10,11,12)
Integer.parseInt("12", 8);  // 10 - int
Integer.valueOf("12", 8);   // 10 - Integer
Integer.decode("012");      // 10 - Integer
// base 16
// 18 (0,1,...,F,10,11,12)
Integer.parseInt("12",16);  // 18 - int
Integer.valueOf("12",16);   // 18 - Integer
Integer.decode("#12");      // 18 - Integer
Integer.decode("0x12");     // 18 - Integer
Integer.decode("0X12");     // 18 - Integer
// base 2
Integer.parseInt("11",2);   // 3 - int
Integer.valueOf("11",2);    // 3 - Integer

如果你想得到 int 代替 Integer 您可以使用:

  1. 拆箱:

    int val = Integer.decode("12"); 
    
  2. intValue()

    Integer.decode("12").intValue();
    

27
2018-03-07 00:42



最后!真的很想发布转化结果/输出的人!你还可以添加一些“ - ”标志吗? - not2qubit


只要给定String不包含Integer的可能性最小,就必须处理这种特殊情况。可悲的是,标准的Java方法 Integer::parseInt 和 Integer::valueOf 抛出一个 NumberFormatException 发出这种特殊情况的信号。因此,您必须使用流控制的异常,这通常被认为是错误的编码风格。

在我看来,这个特殊情况应该通过返回来处理 Optional<Integer>。由于Java不提供这样的方法,我使用以下包装器:

private Optional<Integer> tryParseInteger(String string) {
    try {
        return Optional.of(Integer.valueOf(string));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

用法:

// prints 1234
System.out.println(tryParseInteger("1234").orElse(-1));
// prints -1
System.out.println(tryParseInteger("foobar").orElse(-1));

虽然这仍然在内部使用流控制的异常,但使用代码变得非常干净。


20
2018-04-04 03:13





将字符串转换为int比仅转换数字更复杂。您已经考虑过以下问题:

  • 字符串是否只包含数字 0-9
  • 怎么了 - / + 在字符串之前或之后?这是可能的(指会计数字)?
  • 怎么了 MAX _- / MIN_INFINITY? 如果字符串是99999999999999999999会发生什么?机器可以将此字符串视为int吗?

19
2017-10-20 13:18



是的 - 并且在-2 ^ 31附近有一个令人讨厌的边缘情况。如果你尝试否定2 ^ 31,你可能会遇到困难...... - SusanW