Java에서 String
을 int
로 어떻게 변환합니까?
내 문자열에는 숫자만 포함되어 있으며 이 문자열이 나타내는 숫자를 반환하고 싶습니다.
예를 들어, 문자열 "1234"
가 주어지면 결과는 숫자 1234
여야 합니다.
질문자 :Unknown user
Java에서 String
을 int
로 어떻게 변환합니까?
내 문자열에는 숫자만 포함되어 있으며 이 문자열이 나타내는 숫자를 반환하고 싶습니다.
예를 들어, 문자열 "1234"
가 주어지면 결과는 숫자 1234
여야 합니다.
String myString = "1234"; int foo = Integer.parseInt(myString);
Java 문서 를 보면 "catch"가 이 함수가 NumberFormatException
던질 수 있다는 사실을 알 수 있습니다. 물론 다음과 같이 처리해야 합니다.
int foo; try { foo = Integer.parseInt(myString); } catch (NumberFormatException e) { foo = 0; }
(이 처리는 기본적으로 잘못된 숫자를 0
으로 설정하지만 원하는 경우 다른 작업을 수행할 수 있습니다.)
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
/ parseShort
, Long.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 블록을 저장합니다.
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
Integer
대신 int
를 얻으려면 다음을 사용할 수 있습니다.
언박싱:
int val = Integer.decode("12");
intValue()
:
Integer.decode("12").intValue();
현재 저는 위와 같은 특정 표현을 사용할 수 없는 대학에서 과제를 하고 있는데 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라는 두 개의 double을 가지고 있지만 12로 바꿔야 합니다. 우리가 할 수 있는 어떤 수학 연산도 없습니다.
후자(마지막 숫자)를 다음과 같이 2/10 = 0.2
(따라서 두 배가 되는 이유) 방식으로 10으로 나눕니다.
lastdigit = lastdigit / 10;
이것은 단지 숫자를 가지고 노는 것입니다. 우리는 마지막 숫자를 소수로 바꾸고 있었습니다. 그러나 이제 무슨 일이 일어나는지 보십시오.
double jointdigits = semilastdigit + lastdigit; // 1.0 + 0.2 = 1.2
수학에 너무 깊이 들어가지 않고 단순히 숫자의 단위를 분리합니다. 알다시피, 우리는 0-9만 고려하기 때문에 10의 배수로 나누는 것은 그것을 저장하는 "상자"를 만드는 것과 같습니다(1학년 교사가 단위와 100이 무엇인지 설명했을 때를 생각해 보세요). 그래서:
int finalnumber = (int) (jointdigits*10); // Be sure to use parentheses "()"
그리고 당신은 간다. 다음 제한 사항을 고려하여 자릿수 문자열(이 경우 두 자릿수)을 두 자릿수로 구성된 정수로 변환했습니다.
이를 수행하는 방법:
Integer.parseInt(s)
Integer.parseInt(s, radix)
Integer.parseInt(s, beginIndex, endIndex, radix)
Integer.parseUnsignedInt(s)
Integer.parseUnsignedInt(s, radix)
Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
Integer.valueOf(s)
Integer.valueOf(s, radix)
Integer.decode(s)
NumberUtils.toInt(s)
NumberUtils.toInt(s, defaultValue)
Integer.valueOf는 Integer 객체를 생성하고 다른 모든 메소드는 기본 int를 생성합니다.
마지막 두 가지 방법은 commons-lang3 및 변환에 대한 큰 기사 here 입니다.
주어진 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 "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을 파싱할 수 없는 경우를 명확하게 구분할 수 있습니다.
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로 변환하는 것은 단순히 숫자를 변환하는 것보다 더 복잡합니다. 다음 문제에 대해 생각했습니다.
String 값을 정수 값으로 변환하기 위해 Integer
parseInt(String str)
메서드를 사용할 수 있습니다.
예를 들어:
String strValue = "12345"; Integer intValue = Integer.parseInt(strVal);
Integer
valueOf(String str)
메서드도 제공합니다.
String strValue = "12345"; Integer intValue = Integer.valueOf(strValue);
변환을 위해 NumberUtils 유틸리티 클래스 의 toInt(String strValue)
를 사용할 수도 있습니다.
String strValue = "12345"; Integer intValue = NumberUtils.toInt(strValue);
해결책이 있는데 얼마나 효과적인지는 모르겠습니다. 하지만 잘 작동하고 있으며 개선할 수 있다고 생각합니다. 반면에 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)); } } }
Google Guava 에는 null
을 반환하는 tryParse(String)가 있습니다. 예를 들면 다음과 같습니다.
Integer fooInt = Ints.tryParse(fooString); if (fooInt != null) { ... }
숫자가 아닌 모든 문자를 제거한 다음 정수를 구문 분석하여 시작할 수도 있습니다.
String mystr = mystr.replaceAll("[^\\d]", ""); int number = Integer.parseInt(mystr);
그러나 이것은 음수가 아닌 숫자에 대해서만 작동합니다.
이전 답변 외에도 여러 기능을 추가하고 싶습니다. 사용하는 동안의 결과는 다음과 같습니다.
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; }
언급했듯이 Apache Commons의 NumberUtils
가 이를 수행할 수 있습니다. 문자열을 int로 변환할 수 없으면 0
반환합니다.
고유한 기본값을 정의할 수도 있습니다.
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;
몇 가지 예방 조치를 취하면 이 코드를 사용할 수도 있습니다.
옵션 #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 값을 반환하지 않기 때문에 비교 또는 모든 종류의 계산에 문자열 상수를 사용하는 것은 항상 좋은 생각입니다.
new Scanner("1244").nextInt()
사용할 수 있습니다. 또는 int가 있는지 묻습니다. new Scanner("1244").hasNextInt()
숫자가 항상 유효한 정수라고 확신하는 프로그래밍 대회에서 입력을 구문 분석하는 고유한 방법을 작성할 수 있습니다. 이것은 모든 유효성 검사 관련 코드를 건너뛰고(이 중 어느 것도 필요하지 않기 때문에) 조금 더 효율적입니다.
유효한 양의 정수의 경우:
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; }
양수 및 음수 모두:
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; }
이 숫자 앞이나 뒤에 공백이 예상되는 경우 추가 처리 전에 str = str.trim()
간단히 다음을 시도할 수 있습니다.
Integer.parseInt(your_string);
String
을 int
로 변환하려면Double.parseDouble(your_string);
사용하십시오. String
을 double
로 변환하려면 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
일반 문자열의 경우 다음을 사용할 수 있습니다.
int number = Integer.parseInt("1234");
문자열 빌더 및 문자열 버퍼의 경우 다음을 사용할 수 있습니다.
Integer.parseInt(myBuilderOrBuffer.toString());
아무도 String을 매개변수로 사용하는 Integer 생성자를 언급하지 않았다는 사실에 조금 놀랐습니다.
여기 있습니다:
String myString = "1234"; int i1 = new Integer(myString);
물론 생성자는 Integer
유형을 반환하고 unboxing 작업은 값을 int
로 변환합니다.
참고 1: 언급하는 것이 중요합니다 . 이 생성자는 parseInt
메서드를 호출합니다.
public Integer(String var1) throws NumberFormatException { this.value = parseInt(var1, 10); }
참고 2: 더 이상 사용되지 않습니다 . @Deprecated(since="9")
- JavaDoc .
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); } }
다음과 같은 7가지 방법으로 수행할 수 있습니다.
import com.google.common.primitives.Ints; import org.apache.commons.lang.math.NumberUtils; String number = "999";
Ints.tryParse
:
int 결과 = Ints.tryParse(숫자);
NumberUtils.createInteger
:
정수 결과 = NumberUtils.createInteger(숫자);
NumberUtils.toInt
:
int 결과 = NumberUtils.toInt(숫자);
Integer.valueOf
.값:
정수 결과 = Integer.valueOf(숫자);
Integer.parseInt
:
int 결과 = Integer.parseInt(숫자);
Integer.decode
.디코드:
int 결과 = Integer.decode(숫자);
Integer.parseUnsignedInt
:
int 결과 = Integer.parseUnsignedInt(숫자);
int foo = Integer.parseInt("1234");
문자열에 숫자가 아닌 데이터가 없는지 확인하십시오.
이것은 라이브러리를 사용하지 않고 모든 조건이 긍정적이고 부정적인 완전한 프로그램입니다.
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; } }
한 가지 방법은 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);
여기 우리가 간다
String str = "1234"; int number = Integer.parseInt(str); print number; // 1234
import java.util.*; public class strToint { public static void main(String[] args) { String str = "123"; byte barr[] = str.getBytes(); System.out.println(Arrays.toString(barr)); int result = 0; for(int i = 0; i < barr.length; i++) { //System.out.print(barr[i]+" "); int ii = barr[i]; char a = (char) ii; int no = Character.getNumericValue(a); result = result * 10 + no; System.out.println(result); } System.out.println("result:"+result); } }
출처 : http:www.stackoverflow.com/questions/5585779/how-do-i-convert-a-string-to-an-int-in-java
Git에서 파일의 일부만 커밋 (0) | 2021.10.26 |
---|---|
Bash에서 문자열 변수를 연결하는 방법 (0) | 2021.10.26 |
jQuery에 "존재하는" 기능이 있습니까? (0) | 2021.10.09 |
"namespace std를 사용 중"인 이유는 무엇입니까? 나쁜 습관으로 간주됩니까? (0) | 2021.10.09 |
참조로 변수를 전달하는 방법은 무엇입니까? (0) | 2021.10.09 |