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

如何在 Java 中将String转换为int

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

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

答案

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

如果您查看Java 文档,您会发现 “捕获” 是此函数可以引发NumberFormatException ,当然您必须处理:

int foo;
try {
   foo = Integer.parseInt(myString);
}
catch (NumberFormatException e)
{
   foo = 0;
}

(此处理方式默认将格式错误的数字设置为0 ,但您可以根据需要执行其他操作。)

另外,您可以使用 Guava 库中的Ints方法,该方法与 Java 8 的Optional结合使用,提供了一种强大而简洁的方法来将字符串转换为 int:

import com.google.common.primitives.Ints;

int foo = Optional.ofNullable(myString)
 .map(Ints::tryParse)
 .orElse(0)

例如,以下两种方式:

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

这些方法之间略有不同:

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

在所有情况下都是相同的: Short.valueOf / parseShortLong.valueOf / parseLong等。

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

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.
}

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

手动执行:

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;
}

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

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

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

Apache NumberUtils API 版本 3.4

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

首先要做的是接收输入,在这种情况下,是一串数字。我将其称为String number ,在这种情况下,我将使用数字 12 进行示例,因此String number = "12";

另一个局限性是我不能使用重复循环,因此,也不能使用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,因此我们无法进行任何数学运算。

我们以2/10 = 0.2 (因此为什么加倍)的方式将后者(最后一位)除以 10,如下所示:

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 之类的 “魔术” 表达式

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();

只要给定的 String 极有可能不包含 Integer,就必须处理这种特殊情况。可悲的是,标准 Java 方法Integer::parseIntInteger::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));

尽管这仍在内部使用异常进行流控制,但是用法代码变得非常干净。

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

  • 字符串仅包含数字0-9吗?
  • 字符串前后的-/ +是怎么回事?有可能吗(指会计编号)?
  • MAX _- / MIN_INFINITY 怎么了?如果字符串是 99999999999999999999,会发生什么?机器可以将此字符串视为 int 吗?

方法如下:

1. Integer.parseInt(s)
 2. Integer.parseInt(s, radix)
 3. Integer.parseInt(s, beginIndex, endIndex, radix)
 4. Integer.parseUnsignedInt(s)
 5. Integer.parseUnsignedInt(s, radix)
 6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
 7. Integer.valueOf(s)
 8. Integer.valueOf(s, radix)
 9. Integer.decode(s)
 10. NumberUtils.toInt(s)
 11. NumberUtils.toInt(s, defaultValue)

Integer.valueOf 产生 Integer 对象,所有其他方法 - 原始 int。

commons-lang3和有关此处转换的大型文章的后两种方法。