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


Answers

例如,这里有两种方法:

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

这些方法之间有微小的区别:

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

对于所有情况也是如此: Short.valueOf / parseShortLong.valueOf / parseLong

Question

如何在Java中将String转换为int

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

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




手动执行:

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




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

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



我有一个解决方案,但我不知道它是多么有效。 但它的效果很好,我想你可以改进它。 另一方面,我做了几个测试与JUnit正确的步骤。 我附上了功能和测试:

static public Integer str2Int(String str) {
    Integer result = null;
    if (null == str || 0 == str.length()) {
        return null;
    }
    try {
        result = Integer.parseInt(str);
    } 
    catch (NumberFormatException e) {
        String negativeMode = "";
        if(str.indexOf('-') != -1)
            negativeMode = "-";
        str = str.replaceAll("-", "" );
        if (str.indexOf('.') != -1) {
            str = str.substring(0, str.indexOf('.'));
            if (str.length() == 0) {
                return (Integer)0;
            }
        }
        String strNum = str.replaceAll("[^\\d]", "" );
        if (0 == strNum.length()) {
            return null;
        }
        result = Integer.parseInt(negativeMode + strNum);
    }
    return result;
}

使用JUnit测试:

@Test
public void testStr2Int() {
    assertEquals("is numeric", (Integer)(-5), Helper.str2Int("-5"));
    assertEquals("is numeric", (Integer)50, Helper.str2Int("50.00"));
    assertEquals("is numeric", (Integer)20, Helper.str2Int("$ 20.90"));
    assertEquals("is numeric", (Integer)5, Helper.str2Int(" 5.321"));
    assertEquals("is numeric", (Integer)1000, Helper.str2Int("1,000.50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int("0.50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int(".50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int("-.10"));
    assertEquals("is numeric", (Integer)Integer.MAX_VALUE, Helper.str2Int(""+Integer.MAX_VALUE));
    assertEquals("is numeric", (Integer)Integer.MIN_VALUE, Helper.str2Int(""+Integer.MIN_VALUE));
    assertEquals("Not
     is numeric", null, Helper.str2Int("czv.,xcvsa"));
    /**
     * Dynamic test
     */
    for(Integer num = 0; num < 1000; num++) {
        for(int spaces = 1; spaces < 6; spaces++) {
            String numStr = String.format("%0"+spaces+"d", num);
            Integer numNeg = num * -1;
            assertEquals(numStr + ": is numeric", num, Helper.str2Int(numStr));
            assertEquals(numNeg + ": is numeric", numNeg, Helper.str2Int("- " + numStr));
        }
    }
}



只是为了好玩:您可以使用Java 8的OptionalString转换为Integer

String str = "123";
Integer value = Optional.of(str).map(Integer::valueOf).get();
// Will return the integer value of the specified string, or it
// will throw an NPE when str is null.

value = Optional.ofNullable(str).map(Integer::valueOf).orElse(-1);
// Will do the same as the code above, except it will return -1
// when srt is null, instead of throwing an NPE.

这里我们只是结合Integer.valueOfOptinal 。 可能会有这种情况,这是有用的 - 例如当你想避免空检查。 前Java 8代码将如下所示:

Integer value = (str == null) ? -1 : Integer.parseInt(str);



除了这些上面的答案,我想添加几个功能:

    public static int parseIntOrDefault(String value, int defaultValue) {
    int result = defaultValue;
    try {
      result = Integer.parseInt(value);
    } catch (Exception e) {

    }
    return result;
  }

  public static int parseIntOrDefault(String value, int beginIndex, int defaultValue) {
    int result = defaultValue;
    try {
      String stringValue = value.substring(beginIndex);
      result = Integer.parseInt(stringValue);
    } catch (Exception e) {

    }
    return result;
  }

  public static int parseIntOrDefault(String value, int beginIndex, int endIndex, int defaultValue) {
    int result = defaultValue;
    try {
      String stringValue = value.substring(beginIndex, endIndex);
      result = Integer.parseInt(stringValue);
    } catch (Exception e) {

    }
    return result;
  }

运行它们时这些是结果:

  public static void main(String[] args) {
    System.out.println(parseIntOrDefault("123", 0)); // 123
    System.out.println(parseIntOrDefault("aaa", 0)); // 0
    System.out.println(parseIntOrDefault("aaa456", 3, 0)); // 456
    System.out.println(parseIntOrDefault("aaa789bbb", 3, 6, 0)); // 789
  }



您也可以使用此代码,并采取一些预防措施。

  • 选项1:明确处理异常,例如显示消息对话框,然后停止执行当前工作流。 例如:

    try
        {
            String stringValue = "1234";
    
            // From String to Integer
            int integerValue = Integer.valueOf(stringValue);
    
            // Or
            int integerValue = Integer.ParseInt(stringValue);
    
            // Now from integer to back into string
            stringValue = String.valueOf(integerValue);
        }
    catch (NumberFormatException ex) {
        //JOptionPane.showMessageDialog(frame, "Invalid input string!");
        System.out.println("Invalid input string!");
        return;
    }
  • 选项#2:如果执行流程在异常情况下可以继续,则重置受影响的变量。 例如,在catch块中进行一些修改

    catch (NumberFormatException ex) {
        integerValue = 0;
    }

使用字符串常量进行比较或任何类型的计算总是一个好主意,因为一个常量不会返回一个空值。




Guava有tryParse(String) ,如果无法解析字符串,则返回null ,例如:

Integer fooInt = Ints.tryParse(fooString);
if (fooInt != null) {
  ...
}



在编程比赛中,您确定数字将始终为有效整数,那么您可以编写自己的方法来解析输入。 这将跳过所有与验证相关的代码(因为您不需要任何代码),并将会更有效率。

  1. 对于有效的正整数:

    private static int parseInt(String str) {
        int i, n = 0;
    
        for (i = 0; i < str.length(); i++) {
            n *= 10;
            n += str.charAt(i) - 48;
        }
        return n;
    }
  2. 对于正整数和负整数:

    private static int parseInt(String str) {
        int i=0, n=0, sign=1;
        if(str.charAt(0) == '-') {
            i=1;
            sign=-1;
        }
        for(; i<str.length(); i++) {
            n*=10;
            n+=str.charAt(i)-48;
        }
        return sign*n;
    }

  3. 如果您期望在这些数字之前或之后的空格,则在进一步处理之前,请确保执行一个str = str.trim()




对于正常字符串,您可以使用:

int number = Integer.parseInt("1234");

对于String构建器和String缓冲区,您可以使用:

Integer.parseInt(myBuilderOrBuffer.toString());



String s="100";
try {
 int i=Integer.parseInt( s );
}catch( Exception e ) {
 System.out.println(e.getMessage());
}



String s="100L";
try {
  int i=Integer.parseInt( s );
 }catch( Exception e ) {
  System.out.println(e.getMessage());
}



或者,您可以使用Integer.valueOf()。 它将返回一个Integer对象。

String numberStringFormat = "10";
Integer resultIntFormat = Integer.valueOf(numberStringFormat);
LOG.info("result:"+result);

输出:

10