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


3026

我怎么能转换StringintJava中?

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

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


1
顺便提一下,请注意,如果字符串为null,则调用:int i = Integer.parseInt(null); 引发NumberFormatException,而不是NullPointerException。
帕维尔·莫尔恰诺夫

2
当缺少规范的重要部分时,这个问题应该得到如此高的评价,我感到有些惊讶:如果字符串不只包含数字,该怎么办?例如,许多答案会很高兴地解析“ -1”并返回-1,但是我们不知道这是否可以接受。
迈克尔·凯

Answers:


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

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

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

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

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

import com.google.common.primitives.Ints;

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

23
除了捕获NumberFormatException之外,用户还应该注意传递的字符串的长度。如果它们足够长以溢出整数,则可能需要考虑使用Long :: parseLong。
艾莉森

6
@Allison,尤其是例如在PostgreSQL自动递增主键字段中使用BIGINT字段时。更安全的使用时间长
Letholdrus '18

7
您可以先检查字符串是否为数字:stackoverflow.com/questions/1102891/…–
JPRLCol

当字符串不是以10为底的可分析整数时,此方法也会引发异常。请使用重载方法在其他基础上工作。例如Integer.parseInt(“ 1001”,8); 为基础8.
lokesh

2
另外,虽然结合使用Guava和Java 8的Optional可能功能强大,但这可能是一个矫kill过正,不如使用来自Apache commons-lang库的NumberUtils.toInt(String str,int defaultValue)简洁:int foo = NumberUtils.toInt(myString, 0);
Kunda,

681

例如,以下两种方式:

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

这些方法之间略有不同:

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

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


80
有关这两种方法之间的差异,请参见以下问题
hertzsprung 2013年

19
valueOf方法只是return valueOf(parseInt(string));
Paul Verest 2014年

@PaulVerest我不明白... valueOf递归调用自己吗?
idclev 463035818'9

1
@ user463035818 valueOf有两个重载-int和String。valueOf(String)通过首先使用将字符串解析为一个整数parseInt(String),然后使用将该整数包装到一个整数中来实现valueOf(int)。这里没有递归,因为valueOf(String)valueOf(int)是两个完全不同的函数,即使它们具有相同的名称。
PhilipRoman '18 -10-31

244

好吧,要考虑的一个非常重要的一点是,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.
}

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


如何解析“ 26263Hello”?在这种情况下,我要提取26263
idclev 463035818 '18

1
@ user463035818-请参阅docs.oracle.com/javase/8/docs/api/java/util/regex/…-的常规表达模式"([0-9]+)"将“捕获”一个或多个数字的第一个序列(从一到九)。查看Matcher该程序包中的类。
Mark Stewart

83

手动执行:

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

21
如果输入大于2 ^ 32怎么办?如果输入包含非数字字符怎么办?
ohm

86
程序员在加入员工队伍之前必须学习的一件事,就是从不重新发明轮子。这可能是一个有趣的练习,但是如果您在商业环境中进行这种操作,请不要期望您的代码通过代码审查。
达伍德·伊本·卡里姆

42
-1对不起,但这是一个非常差的算法,有很多限制,没有错误处理,并且有些怪异的异常现象(例如,“”给出了一个例外,“-”将产生0,而“ +”产生-5)。为什么有人会选择这个Integer.parseInt(s)呢?-我知道这是一个面试问题,但a)并不意味着您会这样做(这是发问者的要求),b)无论如何,这个答案都是一个很糟糕的例子。
SusanW

1
-1因为如果我想解析基数为3​​1的整数怎么办?Integer.parseInt(str,31)是执行此操作的一个内衬。评论略显滑稽,但下方有重点。
内森·亚当斯

1
该代码似乎是从著名的库中改编而成的,用于在竞争性编程竞赛中提供快速IO。在这种情况下,保证输入数据是有效的,并且对解决方案进行速度分级。它应该比快Integer.parseInt ,因为它没有验证。
kaya3

53

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

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

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

Apache NumberUtils API版本3.4


33
解析无效数字时,您很少希望使用0。
2016年

4
如果未在对象上设置int字段,则Java将使用默认值零。因此,在这方面有意义。
Ryboflavin

14
@Ryboflavin不,不是。其中一个是定义明确的语言语义,另一个是例外
以太太太(

44

目前,我正在为大学做作业,在这里我无法使用某些表达式,例如上面的表达式,通过查看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之类的“魔术”表达式

7
在性能上,使用double类型解析整数不仅是一个坏主意。像0.2这样的值是浮点表示形式的周期数,不能精确表示。尝试使用System.out.println(0.1 + 0.2)来查看该点-结果将不是0.3!在任何情况下都最好坚持使用库代码,在这种情况下,最好使用Integer.parseInt()。
ChrisB 2015年

9
目前尚不清楚此答案试图解决什么样的问题,首先,为什么任何人都应该受到您描述的限制,其次,为什么必须查看ASCII表,因为您可以简单地将其'0'用于字符而不是48不必麻烦它的实际数值。第三,带double值的整个改道完全没有意义,因为您要除以10,然后再乘以10。结果简单地是semilastdigit * 10 + lastdigit从小学学到的,即采用了十进制系统时…
Holger

2
@Holger在开始编程时以及在测试中不得不写(笔/纸)类似的交互时,都会受到个人的限制。这是罕见的,但是它是一种易于理解的方法,虽然它不是最有效的方法,但对于小型项目而言,它却足够有效。SO.SE旨在帮助所有人,而不仅仅是少数。我为那些刚开始学习如何创建伪算法并将其转化为算法而不是使用预制的Java表达式的人提供了一种替代方法。尽管我确实忘记了“ 0”很酷
橡树

为什么将所有内容除以10,然后最后再乘以10?此外,“ parseInt”不是魔术,也不是表达式,它是一个经过了近3
Nathan Adams

1
这不是一个好答案。问题是“如何在Java中将String转换为int?” 不是,“我如何在任意限制下解决此家庭作业问题?” 这是StackOverflow,而不是HomeworkOverflow。
DavidS,

37

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

最后!有人不愿意发布转换的结果/输出!您还可以添加一些带有“-”符号的符号吗?
not2qubit

29

只要给定的String极有可能不包含Integer,就必须处理这种特殊情况。可悲的是,标准Java方法Integer::parseIntInteger::valueOf抛出一个NumberFormatException信号来表示这种特殊情况。因此,您必须对流控制使用异常,这通常被认为是不良的编码风格。

我认为,应通过返回empty来处理这种特殊情况Optional<Integer>。由于Java不提供这种方法,因此我使用以下包装器:

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

用法示例:

// prints "12"
System.out.println(tryParseInteger("12").map(i -> i.toString()).orElse("invalid"));
// prints "-1"
System.out.println(tryParseInteger("-1").map(i -> i.toString()).orElse("invalid"));
// prints "invalid"
System.out.println(tryParseInteger("ab").map(i -> i.toString()).orElse("invalid"));

尽管这仍在内部使用异常进行流控制,但是用法代码变得非常干净。此外,您可以清楚地区分-1解析为有效值的情况和无法解析无效String的情况。


24

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

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

1
是的-在-2 ^ 31周围有一个讨厌的边缘情况。如果您尝试否定2 ^ 31,则可能会遇到困难……
SusanW

24

方法如下:

 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和有关此处转换的大型文章中的后两种方法。


22

我们可以使用parseInt(String str)的方法Integer包装器类将String值转换为整数值。

例如:

String strValue = "12345";
Integer intValue = Integer.parseInt(strVal);

所述Integer类还提供了valueOf(String str)方法,包括:

String strValue = "12345";
Integer intValue = Integer.valueOf(strValue);

我们也可以使用toInt(String strValue)NumberUtils工具类的转换:

String strValue = "12345";
Integer intValue = NumberUtils.toInt(strValue);

22

使用Integer.parseInt(yourString)

请记住以下几点:

Integer.parseInt("1"); // 好

Integer.parseInt("-1"); // 好

Integer.parseInt("+1"); // 好

Integer.parseInt(" 1"); //异常(空白)

Integer.parseInt("2147483648");//异常(整数限制为最大值 2,147,483,647)

Integer.parseInt("1.1");//异常(或不允许的任何东西)

Integer.parseInt(""); //异常(非0或其他值)

仅有一种例外: NumberFormatException


这里的int最大值还会给出NumberFormatException吗?
The Coding Wombat 18-10-24

不,最大值尚可
Lukas Bauer

19

我有一个解决方案,但我不知道它有多有效。但是它运作良好,我认为您可以改善它。另一方面,我对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));
        }
    }
}

你可以做到这一点简单:(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
大卫·霍瓦特


17

您也可以先删除所有非数字字符,然后解析整数:

String mystr = mystr.replaceAll("[^\\d]", "");
int number = Integer.parseInt(mystr);

但请注意,这仅适用于非负数。


18
这将导致-42解析为42

10
是的,这仅适用于以开头正确的非负数,因此不需要此替换步骤。对于其他每种情况,这种自动修复的尝试都会使情况变得更糟(几乎是每次自动修复的尝试)。如果我通过"4+2"42结果将是毫无暗示的暗示我试图做的事被误导了。用户会得到这样的印象:输入基本表达式就像4+2是有效输入,但是应用程序继续输入错误的值。除此之外,类型是String,而不是string……
Holger

或将第一行更改为->字符串mystr = mystr.replaceAll(“ [^ \\ d \\-]”,“”);
2016年

13

除了前面的答案,我还要添加几个功能。这些是您使用它们时的结果:

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
}

实现方式:

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

10

如前所述,Apache Commons NumberUtils可以做到。它返回0如果无法将字符串转换为int。

您还可以定义自己的默认值:

NumberUtils.toInt(String str, int defaultValue)

例:

NumberUtils.toInt("3244", 1) = 3244
NumberUtils.toInt("", 1)     = 1
NumberUtils.toInt(null, 5)   = 5
NumberUtils.toInt("Hi", 6)   = 6
NumberUtils.toInt(" 32 ", 1) = 1 // Space in numbers are not allowed
NumberUtils.toInt(StringUtils.trimToEmpty("  32 ", 1)) = 32;

9

在采取一些预防措施的同时,您也可以使用此代码。

  • 选项#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;
    }

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


4
给出JOptionPane.showMessageDialog()对原始Java问题的答案没有任何意义。
John Hascall

2
Integer.valueOf(String);不返回type int
php_coder_3809625 '16


9

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

  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()在进一步处理之前先做一个。


7

您只需尝试以下操作:

  • 使用Integer.parseInt(your_string);要转换Stringint
  • 用于Double.parseDouble(your_string);将转换Stringdouble

String str = "8955";
int q = Integer.parseInt(str);
System.out.println("Output>>> " + q); // Output: 8955

String str = "89.55";
double q = Double.parseDouble(str);
System.out.println("Output>>> " + q); // Output: 89.55

除了几年前推荐Integer.parseInt的建议之外,这个答案似乎没有添加任何其他东西(将String转换为double将是一个不同的问题)。
伯恩哈德·巴克

7

对于普通字符串,可以使用:

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

对于字符串构建器和字符串缓冲区,可以使用:

Integer.parseInt(myBuilderOrBuffer.toString());


6

令我惊讶的是,没有人提到将String作为参数的Integer构造函数。

因此,这里是:

String myString = "1234";
int i1 = new Integer(myString);

Java 8-整数(String)

当然,构造函数将返回type Integer,并且拆箱操作会将值转换为int


值得一提的是:此构造函数调用parseInt方法。

public Integer(String var1) throws NumberFormatException {
    this.value = parseInt(var1, 10);
}

5

使用Integer.parseInt()并将其放在try...catch块中以处理任何错误,以防万一输入了非数字字符,例如,

private void ConvertToInt(){
    String string = txtString.getText();
    try{
        int integerValue=Integer.parseInt(string);
        System.out.println(integerValue);
    }
    catch(Exception e){
       JOptionPane.showMessageDialog(
         "Error converting string to integer\n" + e.toString,
         "Error",
         JOptionPane.ERROR_MESSAGE);
    }
 }


5

它可以通过以下七种方式完成:

import com.google.common.primitives.Ints;
import org.apache.commons.lang.math.NumberUtils;

String number = "999";

1)使用Ints.tryParse

int result = Ints.tryParse(number);

2)使用NumberUtils.createInteger

Integer result = NumberUtils.createInteger(number);

3)使用NumberUtils.toInt

int result = NumberUtils.toInt(number);

4)使用Integer.valueOf

Integer result = Integer.valueOf(number);

5)使用Integer.parseInt

int result = Integer.parseInt(number);

6)使用Integer.decode

int result = Integer.decode(number);

7)使用Integer.parseUnsignedInt

int result = Integer.parseUnsignedInt(number);

NumberUtils也处理空和空方案。
Sundararaj Govindasamy

5

一种方法是parseInt(String)。它返回一个原始的int:

String number = "10";
int result = Integer.parseInt(number);
System.out.println(result);

第二个方法是valueOf(String),它返回一个新的Integer()对象:

String number = "10";
Integer result = Integer.valueOf(number);
System.out.println(result);

以前的答案中没有涵盖吗?
彼得·莫滕森

4

您可以使用以下任何一种:

  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)

4

这是一个完整的程序,无需使用库即可在所有正负条件下运行

import java.util.Scanner;


public class StringToInt {

    public static void main(String args[]) {
        String inputString;
        Scanner s = new Scanner(System.in);
        inputString = s.nextLine();

        if (!inputString.matches("([+-]?([0-9]*[.])?[0-9]+)")) {
            System.out.println("Not a Number");
        }
        else {
            Double result2 = getNumber(inputString);
            System.out.println("result = " + result2);
        }
    }


    public static Double getNumber(String number) {
        Double result = 0.0;
        Double beforeDecimal = 0.0;
        Double afterDecimal = 0.0;
        Double afterDecimalCount = 0.0;
        int signBit = 1;
        boolean flag = false;

        int count = number.length();
        if (number.charAt(0) == '-') {
            signBit = -1;
            flag = true;
        }
        else if (number.charAt(0) == '+') {
            flag = true;
        }
        for (int i = 0; i < count; i++) {
            if (flag && i == 0) {
                continue;
            }
            if (afterDecimalCount == 0.0) {
                if (number.charAt(i) - '.' == 0) {
                    afterDecimalCount++;
                }
                else {
                    beforeDecimal = beforeDecimal * 10 + (number.charAt(i) - '0');
                }
            }
            else {
                afterDecimal = afterDecimal * 10 + number.charAt(i) - ('0');
                afterDecimalCount = afterDecimalCount * 10;
            }
        }
        if (afterDecimalCount != 0.0) {
            afterDecimal = afterDecimal / afterDecimalCount;
            result = beforeDecimal + afterDecimal;
        }
        else {
            result = beforeDecimal;
        }
        return result * signBit;
    }
}

2
无需重新发明轮子,只需使用即可Integer.parseInt
多里安·格雷

@TobiasWeimer是的,我们可以做,但是没有使用图书馆
Anup Gupta

@TobiasWeimer,有些人需要这种不使用Library的方法。
Anup Gupta

5
不,没有人需要它,因为它是JDK中的功能,而不是某些第三方插件。
多里安·格雷
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.