Java에서 문자열을 int로 변환하는 방법


3026

Java에서 String를 로 변환하려면 어떻게 int해야합니까?

내 문자열에는 숫자 만 포함되어 있으며 숫자를 나타내는 숫자를 반환하고 싶습니다.

예를 들어, 문자열 "1234"이 주어지면 결과는 숫자 여야합니다 1234.


1
그런데 문자열이 null이면 호출은 다음과 같습니다. int i = Integer.parseInt (null); NullPointerException이 아닌 NumberFormatException을 발생시킵니다.
Pavel Molchanov

2
사양의 중요한 부분이 누락 된 경우이 질문이 너무 높게 평가되어야한다는 것에 약간 놀랐습니다. 문자열에 숫자 만 포함되어 있지 않으면 어떻게해야합니까? 예를 들어, 많은 답변이 "-1"을 행복하게 구문 분석하고 -1을 반환하지만, 이것이 허용되는지 알 수 없습니다.
Michael Kay

답변:


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

Java 문서 를 보면 "캐치"는이 함수 NumberFormatException가를 처리 할 수 ​​있다는 것을 알 수 있습니다.

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

(이 처리의 기본값은 잘못된 형식입니다. 0 로 설정하지만 원하는 경우 다른 작업을 수행 할 수 있습니다.)

또는 IntsJava 8과 결합하여 Guava 라이브러리 의 메소드를 사용하여 Optional문자열을 int로 변환하는 강력하고 간결한 방법을 만들 수 있습니다.

import com.google.common.primitives.Ints;

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

23
NumberFormatException을 포착하는 것 외에도 사용자는 전달되는 문자열의 길이에주의해야합니다. 정수를 오버플로하기에 충분히 길다면 Long :: parseLong을 대신 사용하는 것이 좋습니다.
Allison

6
@Allison 특히 PostgreSQL 자동 증분 기본 키 필드에서 BIGINT 필드를 사용하는 경우. 오래 사용하는 것이 훨씬 더 안전합니다
Letholdrus

7
문자열이 숫자인지 먼저 확인할 수 있습니다. stackoverflow.com/questions/1102891/…
JPRLCol

이 메소드는 또한 문자열이 10 진법에서 구문 분석 가능한 정수가 아닌 경우 예외를 발생시킵니다. 다른 기반에서 작동하려면 오버로드 된 방법을 사용하십시오. 예를 들어 Integer.parseInt ( "1001", 8); 베이스 8. 소스 .
lokesh

2
또한 Java 8의 Optional과 함께 Guava를 사용하는 것이 강력 할 수 있지만 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
  • parseIntprimitive를 리턴합니다 int.

Short.valueOf/ parseShort, Long.valueOf/ parseLong등 모든 경우에 동일합니다 .


80
두 방법의 차이점에 대해서는 이 질문을
hertzsprung

19
valueOf방법은 그냥return valueOf(parseInt(string));
폴 Verest

@PaulVerest 나는 그것을 얻지 못한다 ... valueOf재귀 적으로 전화?
idclev 463035818

1
@ user463035818 valueOf에는 int 및 String에 대한 두 가지 과부하가 있습니다. valueOf(String)는 먼저 사용하여 String을 int로 구문 분석 parseInt(String)한 다음을 사용하여 Intger에 해당 int를 래핑 하여 구현됩니다 valueOf(int). 여기에는 재귀가 없습니다.valueOf(String)valueOf(int)이름이 같은 경우에도, 두 개의 완전히 다른 기능입니다.
PhilipRoman

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 8:16에

1
@ user463035818 - 참조 docs.oracle.com/javase/8/docs/api/java/util/regex/... -의 정규 expresssion 패턴 "([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;
}

22
입력 값이 2 ^ 32보다 크면 어떻게됩니까? 입력에 숫자가 아닌 문자가 포함되어 있으면 어떻게됩니까?
yohm

87
프로그래머가 노동 조합 가입에 관해 배워야 할 것들 중 하나는 이전과는 달리 바퀴를 다시 발명하지 않는 것입니다. 이것은 재미있는 연습 일 수 있지만 상업 환경에서 이러한 종류의 작업을 수행하면 코드가 코드 검토를 통과하지 않을 것으로 예상됩니다.
Dawood ibn Kareem

43
-1 죄송합니다.이 방법은 제한이 많고 오류 처리가 없으며 이상한 예외가 있습니다 (예 : ""는 예외를 제공하고 "-"는 0을 생성하고 "+"는 -5를 생성 함). 왜 누군가가 이것을 선택 Integer.parseInt(s)하겠습니까? -나는 이것이 인터뷰 질문이라는 점을 알지만 a) 당신이 (이것은 질문자가 요청한) 이런 식으로 할 것을 암시하지 않습니다. 그리고 b)이 대답은 어쨌든 꽤 나쁜 예입니다.
SusanW

1
-1베이스 31 int를 구문 분석하려면 어떻게해야합니까? Integer.parseInt (str, 31)는 그렇게하는 하나의 라이너입니다. 약간 뻔뻔스러운 의견이지만 그 아래에 심각한 요점이 있습니다. 다른 사람이 이미 작업을 시작했을 때 바퀴를 다시 발명하지 마십시오.
Nathan Adams

1
이 코드는 경쟁이 치열한 프로그래밍 공모전에서 빠른 IO를 위해 잘 알려진 라이브러리에서 수정 된 것 같습니다. 이와 관련하여 입력 데이터는 유효하며 솔루션은 속도에 따라 등급이 매겨집니다. 유효성 검사가 없기 Integer.parseInt 때문에 보다 빠릅니다 .
kaya3

53

다른 해결책은 Apache Commons의 NumberUtils 를 사용하는 것입니다 .

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

문자열이 유효하지 않은 숫자 형식이면 항상 0이 반환되므로 Apache 유틸리티가 유용합니다. 따라서 try catch 블록을 절약하십시오.

Apache NumberUtils API 버전 3.4


34
유효하지 않은 숫자를 구문 분석 할 때 0을 사용하는 경우는 거의 없습니다.
wnoise

4
객체의 int 필드가 설정되지 않은 경우 Java는 기본값으로 사용하는 것입니다. 따라서 그 점에서 의미가 있습니다.
Ryboflavin

15
@ Ryboflavin 아니, 그렇지 않습니다. 그 중 하나는 잘 정의 된 언어의 의미이고, 다른 하나는 예외입니다
etherous

43

현재 나는 대학에 배정을하고 있는데, 위의 식과 같은 특정 표현을 사용할 수 없으며 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;

이것은 단지 숫자를 가지고 노는 것입니다. 우리는 마지막 숫자를 10 진수로 바 꾸었습니다. 그러나 이제 어떤 일이 발생하는지 살펴보십시오.

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

수학에 들어 가지 않고 단순히 숫자의 숫자를 단위로 분리합니다. 우리는 0-9 만 고려하기 때문에 10의 배수로 나누는 것은 저장하는 "상자"를 만드는 것과 같습니다 (1 학년 교사가 당신에게 한 단위와 백이 무엇인지 설명했을 때를 다시 생각해보십시오). 그래서:

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

그리고 당신은 간다. 다음 제한 사항을 고려하여 문자열 자릿수 (이 경우 두 자릿수)를이 두 자릿수로 구성된 정수로 바꿨습니다.

  • 반복적 인 사이클 없음
  • parseInt와 같은 "Magic"표현식이 없습니다.

8
정수 구문 분석에 double 유형을 사용하는 것은 성능 측면에서 좋지 않습니다. 0.2와 같은 값은 부동 소수점 표현의주기적인 숫자이며 정확하게 표현할 수 없습니다. System.out.println (0.1 + 0.2)을 사용하여 요점을 확인하십시오. 결과는 0.3이 아닙니다! 가능한 경우 라이브러리 코드를 사용하는 것이 좋습니다 (이 경우 Integer.parseInt ()).
ChrisB

10
당신이 단순히 사용하지 수있는 종류의 문제로 인해이 응답 시도가 ASCII 테이블에서 첫 번째, 누구도 당신이 설명하는 제한이해야하는 이유, 둘째, 왜 볼 필요를 해결하기 위해 무엇 분명하지 않다 '0'대신 문자 48로이 결코 실제 숫자 값으로 귀찮게합니다. 셋째, double값으로 전체 우회는 10으로 나눈 후 전혀 의미가 없으며 나중에 10을 곱하면됩니다. semilastdigit * 10 + lastdigit소수 체계가 도입되었을 때 그 결과는 간단하게 초등학교에서 배운대로…
Holger

2
@Holger 저는 프로그래밍을 처음 시작할 때와 테스트에서 비슷한 상호 작용을 작성해야 할 때 개인적으로 그러한 제한을 받았습니다. 흔하지는 않지만 쉽게 이해되는 방법이며 마일로 가장 효율적이지는 않지만 소규모 프로젝트에 적합하게 작동하는 방법입니다. SO.SE는 소수뿐만 아니라 모든 사람을 돕기위한 것입니다. 나는 의사 알고리즘을 만드는 방법을 배우고 미리 만들어진 Java 표현식을 사용하는 대신 알고리즘으로 바꾸는 것으로 시작하는 사람들을 위해 대체 방법을 제공했습니다. 나는 '0'이 시원하다는 것을 잊었지만
Oak

2
이것은 좋은 대답이 아닙니다. 문제는 "Java에서 문자열을 int로 어떻게 변환합니까?"입니다. "임의의 제한으로이 숙제 문제를 어떻게 해결합니까?" HomeworkOverflow가 아니라 StackOverflow입니다.
DavidS

1
이 새로운 접근 방식을 사용하는 이유는 매우 명확하므로 그 자체로는 문제가되지 않습니다. 그러나 접근 방식에 "반복주기 없음"이 사용된다고 강조하지만 특정 예제에서는 솔루션 (2 자리 숫자)을 하드 코딩하여이 문제를 완전히 무시하고 semilastdigit및 을 사용합니다 lastdigit. 임의 길이의 유효한 숫자 문자열 (예 : "-2147483648"과 "2147483647"사이의 값)을 제공 한 경우 "반복주기"를 피하기 위해 솔루션을 어떻게 코딩하겠습니까?
skomisa

38

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

주어진 문자열에 정수가 포함되어 있지 않을 가능성이있을 때마다이 특수한 경우를 처리해야합니다. 슬프게도, 표준 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유효한 값으로 구문 분석 된 경우와 유효하지 않은 문자열을 구문 분석 할 수없는 경우를 명확하게 구별 할 수 있습니다 .


24

문자열을 정수로 변환하는 것은 숫자를 변환하는 것보다 더 복잡합니다. 다음과 같은 문제에 대해 생각했습니다.

  • 문자열에 숫자 0-9 만 포함되어 있습니까?
  • -/ + 의 최신 소식문자열 전후에 ? 가능합니까 (회계 번호 참조)?
  • 무엇이야 _- / MIN_INFINITY MAX? 문자열이 99999999999999999999이면 어떻게됩니까? 기계가이 문자열을 정수로 취급 할 수 있습니까?

1
예-약 2 ^ 31 정도의 거친 경우가 있습니다. 2 ^ 31을 부정하려고하면 어려움에
처할

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 객체, 다른 모든 메소드-primitive int를 생성합니다.

commons-lang3의 마지막 두 가지 방법 과 here 변환에 대한 큰 기사 .


22

랩퍼 클래스 의 parseInt(String str)메소드를 사용하여 Integer문자열 값을 정수 값으로 변환 할 수 있습니다 .

예를 들면 다음과 같습니다.

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을 제공합니까?
코딩 웜뱃

아니, 최대 값은 STIL 괜찮
루카스 바우어

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...
홀거

또는 첫 번째 줄을-> string mystr = mystr.replaceAll ( "[^ \\ d \\-]", "");
apm

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

상수는 결코 null 값을 반환하지 않기 때문에 비교 또는 모든 종류의 컴퓨팅에 문자열 상수를 사용하는 것이 좋습니다.


4
퍼팅 JOptionPane.showMessageDialog()바닐라 자바 질문에 대답하는 것은 이해되지 않는다.
John Hascall

2
Integer.valueOf(String);유형을 반환하지 않습니다 int.
php_coder_3809625

9

당신이 사용할 수있는 new Scanner("1244").nextInt() . 또는 정수가 존재하는지 묻습니다.new Scanner("1244").hasNextInt()


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로 변환 하는 것은 다른 질문 일 것입니다 ).
Bernhard Barker

7

일반 문자열의 경우 다음을 사용할 수 있습니다.

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

문자열 빌더 및 문자열 버퍼의 경우 다음을 사용할 수 있습니다.

Integer.parseInt(myBuilderOrBuffer.toString());


6

String을 매개 변수로 사용하는 Integer 생성자를 언급 한 사람이 없다는 것에 약간 놀랐습니다.

그래서 여기 있습니다 :

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

Java 8-정수 (문자열) .

물론 생성자는 type을 반환 Integer하고 unboxing 작업은 값을로 변환합니다 int.


언급하는 것이 중요합니다 .이 생성자는 parseInt메소드를 호출합니다 .

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

5

try...catch숫자가 아닌 문자를 입력하는 경우를 대비하여 Integer.parseInt ()를 사용하여 블록 안에 넣어 오류를 처리하십시오.

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

7 가지 방법으로 수행 할 수 있습니다.

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

이전 답변에서 다루지 않습니까?
Peter Mortensen

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, 일부 사람들은 라이브러리를 사용하지 않고이 작업을 수행해야합니다.
Anup Gupta

5
아니요, 타사 플러그인이 아닌 JDK 내부의 기능이기 때문에 아무도 필요하지 않습니다.
Dorian Grey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.