JavaScript에서 문자열을 정수로 변환하는 방법은 무엇입니까?


답변:


2151

가장 간단한 방법은 기본 Number함수 를 사용하는 것입니다 .

var x = Number("1000")

이것이 효과가 없다면 parseInt , 단항 더하기 , parseFloat with floorMath.round 메소드가 있습니다.

파싱 ​​:

var x = parseInt("1000", 10); // you want to use radix 10
    // so you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1])

문자열이 이미 정수 형식 인 경우 단항 플러스 :

var x = +"1000";

문자열이 float이거나 float 일 수 있고 정수를 원하는 경우 :

var x = Math.floor("1000.01"); //floor automatically converts string to number

또는 Math.floor를 여러 번 사용하려는 경우 :

var floor = Math.floor;
var x = floor("1000.01");

parseInt를 호출 할 때 기수를 입력하는 것을 잊어 버린 유형이라면 parseFloat를 사용하고 원하는대로 반올림 할 수 있습니다. 여기서는 바닥을 사용합니다.

var floor = Math.floor;
var x = floor(parseFloat("1000.01"));

흥미롭게도 Math.round (Math.floor와 같은)는 문자열을 숫자로 변환하므로 숫자를 반올림하거나 문자열에 정수가있는 경우 가장 좋은 방법 일 것입니다.

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)

1
jsperf.com/performance-of-parseint/29 , hy @jedierikb 나는 jsperf 링크를 편집했다. '4'>>0및 추가 '4'>>>0.
emaniacs

6
2015로 업데이트 : ECMAScript 5에서 선행 0이 "0"인 문자열도 8 대신 기본 기수 10을 얻습니다. 기수 10을 명시 적으로 지정하면 이전 브라우저에만 필요합니다. kangax.github.io/compat-table/es5/…
Grilse

19
대부분의 사람들은 빈 문자열을 유효한 숫자로 나타내는 것으로 간주하지 않더라도 Number ( '')는 성공합니다 (0을 반환 함). 그리고 대부분의 사람들이 '3q'를 유효한 숫자로 간주하지 않더라도 parseInt ( '3q')는 성공합니다 (3을 반환).
Dave Pacheco

3
올라간다. 모두 parseIntparseFloat행복이 편지를 받아들입니다. 만 Number반환 NaN일관.
Karl Pokus

2
제 생각에는 정수를 구문 분석하면 NaN정확히 정수가 아닌 모든 값에 대해 예외 /가 발생해야 합니다. 그러므로 이들 중 어느 것도 0 으로 Number('2.2')강요 2하고 Number('')강요 하지 않습니다.
Michał Knapik

225

parseInt 함수를 사용해보십시오.

var number = parseInt("10");

그러나 문제가 있습니다. parseInt 함수를 사용하여 "010"을 변환하려고하면 8 진수로 감지되고 숫자 8을 리턴합니다. 따라서 기수 (2-36)를 지정해야합니다. 이 경우베이스 10.

parseInt(string, radix)

예:

var result = parseInt("010", 10) == 10; // Returns true

var result = parseInt("010") == 10; // Returns false

parseInt유효한 것을 구문 분석 한 후 잘못된 데이터 를 무시합니다.
이 안내는 51로 구문 분석됩니다.

var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true

4
기수는 2016 년에 더 이상 필요하지 않습니다.

7
최신 브라우저는 아니지만 이전 버전과의 호환성을 위해 기수가 여전히 필요합니다.
프로그래밍 교수,

'', '02 "또는"02 + 1 ","03,12 "또는"03.12 "는 무엇입니까?
stackdave

3
이는 숫자 다음의 잘못된 데이터를 무시합니다. 예를 들어, parseInt('0asdf', 10)produce 0.
Sam

121

자바 스크립트에서 문자열을 숫자로 변환하는 두 가지 주요 방법이 있습니다. 한 가지 방법은 구문 분석하고 다른 방법은 유형을 숫자로 변경하는 것입니다. 다른 답변 (예 : 단항 더하기)의 모든 트릭은 문자열 유형을 숫자로 암시 적으로 강제하는 것과 관련이 있습니다. Number 함수를 사용하여 동일한 작업을 명시 적으로 수행 할 수도 있습니다.

파싱

var parsed = parseInt("97", 10);

parseInt 및 parseFloat는 문자열을 숫자로 구문 분석하는 데 사용되는 두 가지 함수입니다. 인식 할 수없는 문자에 맞으면 구문 분석이 자동으로 중지됩니다. "92px"와 같은 문자열을 구문 분석하는 데 유용 할 수 있지만 입력이 잘못되면 오류가 발생하지 않으므로 다소 위험합니다. 문자열이 숫자로 시작하지 않으면 NaN이 다시 나타납니다. 문자열 시작 부분의 공백은 무시됩니다. 다음은 원하는 것과 다른 것을 수행하고 문제가 있음을 나타내지 않는 예입니다.

var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

기수를 항상 두 번째 인수로 지정하는 것이 좋습니다. 구식 브라우저에서 문자열이 0으로 시작하면 기수가 지정되지 않으면 많은 사람들을 놀라게했을 경우 8 진수로 해석됩니다. 기수가 지정되지 않은 경우 문자열을 0x로 시작하면 16 진수의 동작이 트리거됩니다 (예 :) 0xff. 표준은 실제로 ecmascript 5로 변경되었으므로 최신 브라우저는 기수가 지정되지 않은 경우 앞에 0이 있으면 더 이상 8 진수를 트리거하지 않습니다. parseInt는 밑이 36 인 기수를 이해하며,이 경우 대문자와 소문자가 모두 동등한 것으로 취급됩니다.

문자열 유형을 숫자로 변경

위에서 언급 한 parseInt를 사용하지 않는 다른 모든 트릭은 문자열을 숫자로 암시 적으로 강제하는 것과 관련이 있습니다. 나는 이것을 명시 적으로하는 것을 선호합니다.

var cast = Number("97");

구문 분석 방법에는 다른 동작이 있습니다 (여전히 공백은 무시하지만). 더 엄격합니다 : 반환하는 것보다 전체 문자열을 이해하지 못하면 NaN같은 문자열에 사용할 수 없습니다 97px. Number 래퍼 객체 대신 기본 숫자를 원하므로 newNumber 함수 앞에 두지 마십시오 .

분명히 숫자로 변환하면 정수가 아니라 부동 소수점 값이 될 수 있으므로 정수를 원하면 수정해야합니다. 이를 수행하는 몇 가지 방법이 있습니다.

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

모든 비트 연산자 (여기서는 비트 단위로 수행했지만 이전 답변이나 비트 시프트에서와 같이 이중 부정을 수행 할 수 있음)는 값을 32 비트 정수로 변환하고 대부분은 부호있는 정수로 변환합니다. 이것은 큰 정수를 원하지 않을 것 입니다. 정수를 32 비트로 표현할 수 없으면 랩핑됩니다.

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

더 큰 숫자를 올바르게 사용하려면 반올림 방법을 사용해야합니다

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

이러한 방법의 모든 지수 표기법을 이해 명심, 그래서 2e2이다 200NaN이보다는. 또한 Number는 "무한대"를 이해하지만 구문 분석 방법은 그렇지 않습니다.

커스텀

이러한 방법 중 하나가 원하는 것을 정확하게 수행하지는 않습니다. 예를 들어, 일반적으로 구문 분석이 실패하면 오류가 발생하고 무한대, 지수 또는 선행 공백을 지원할 필요가 없습니다. 사용 사례에 따라 때로는 사용자 정의 변환 함수를 작성하는 것이 좋습니다.

항상 Number 또는 구문 분석 방법 중 하나의 출력이 예상되는 숫자인지 확인하십시오. 거의 확실하게 isNaN숫자가 NaN이 아닌지 확인하는 데 사용하려고 할 것입니다 (일반적으로 구문 분석이 실패한 것을 알 수있는 유일한 방법).


6
코드가 수락 97,8,00하고 유사한 지 여부를 결정합니다 . 간단한 트릭은 .replace(/[^0-9]/g, "")문자열에서 숫자가 아닌 모든 문자를 제거한 다음 변환을 수행하는 것입니다. 이것은 물론 구문 분석하기보다는 아마도 실수해야 할 모든 종류의 미친 문자열을 무시할 것입니다.
kybernetikos

6
@kybernetikos는 아마도이어야합니다 .replace(/[^0-9.]/g, ""). 그렇지 않으면 "1.05"는 "105"가됩니다.
J.Steve

어쨌든 중요한 코드에 대해서는 그런 식으로 사용하지 않더라도 실제로는 원하지 않는 여러 가지 방법이 있습니다.
kybernetikos

2
코드에서 Number를 훨씬 더 읽기 쉽게 찾았으므로 솔루션으로 지적 해 주셔서 감사합니다.
carlin.scott

1
@kybernetikos 에서 (정수) 대신 ( 메서드 때문에 ) 메소드를 var fixed = Number("97.654").toFixed(0); // rounded rather than truncated받고 있습니다. 둥근 정수를 원한다면 아마 사용하는 것이 좋습니다.string.toFixednumberMath.round("97.654");
Edu Zamora

50

ParseInt ()와 +가 다릅니다

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

37

가장 빠른

var x = "1000"*1;

테스트

속도에 대한 비교는 거의 없습니다 (Mac Os 만 해당) ... :)

크롬 'plus'와 'mul'이 가장 빠르면 (> 700,000,00 op / sec) 'Math.floor'가 가장 느립니다. Firefox의 경우 'plus'가 가장 느립니다 (!) 'mul'이 가장 빠릅니다 (> 900,000,000 op / sec). Safari에서 'parseInt'는 빠르지 만 'number'는 가장 느립니다 (그러나 결과는 매우 유사합니다. 따라서 캐스트 문자열을 int로 사용하는 Safari는 다른 브라우저보다 10 배 이상 느립니다. 그래서 승자는 ' mul '입니다 :)

이 링크 https://jsperf.com/js-cast-str-to-number/1 링크를 사용하여 브라우저에서 실행할 수 있습니다

여기에 이미지 설명을 입력하십시오

최신 정보

나도 테스트 var x = ~~"1000";-Chrome에서 Safari는 var x = "1000"*1(<1 %) 보다 약간 느리고 Firefox에서는 조금 더 빠릅니다 (<1 %). 위의 그림을 갱신 해 테스트


36

오래된 질문이지만 어쩌면 이것은 누군가에게 도움이 될 수 있습니다.

이 방법으로 문자열을 int 숫자 로 변환합니다.

var str = "25";       // string
var number = str*1;   // number

따라서 1을 곱해도 값은 변경되지 않지만 js는 자동으로 숫자를 반환합니다.

그러나 아래에 표시된 것처럼 str숫자가 숫자 (또는 숫자로 표시 될 수 있음) 라고 확신하면 사용해야합니다 . 그렇지 않으면 숫자가 아닌 NaN을 반환합니다.

사용할 간단한 함수를 만들 수 있습니다. 예 :

function toNumber(str) {
   return str*1;
}

여기에 이미지 설명을 입력하십시오


33

parseInt를 시도하십시오.

var number = parseInt("10", 10); //number will have value of 10.

4
기수도 함께 포함하고 싶을 수도 있습니다. var number = parseInt ( "10", 10);
Joel Coehoorn

27

여기에 잘못된 답변을 게시했습니다. 죄송합니다. 결정된.

이것은 오래된 질문이지만이 트릭을 좋아합니다.

~~"2.123"; //2
~~"5"; //5

이중 비트 음수는 소수점 뒤에있는 것을 제거하고 숫자 형식으로 변환합니다. 나는 함수를 호출하는 것보다 약간 빠르다는 말을 들었습니다. 그러나 나는 완전히 확신하지 못했습니다.

편집 : 방금 본 또 다른 방법은 여기 (제로 채우기 오른쪽 시프트는 자바 스크립트 >>> 연산자에 대한 질문) 프로그램이 연산자 0으로 번호를 이동하는 것은에 수를 변환하는 것이 UINT32 당신이 경우에 좋은 또한 서명하지 않기를 원합니다 . 다시, 이것은 부호없는 정수 로 변환되어 부호 있는 숫자를 사용하면 이상한 행동을 일으킬 수 있습니다.

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5

19

과학적 표기법으로 float를 변환하기 위해 parseInt를 사용할 경우주의하십시오! 예를 들면 다음과 같습니다.

parseInt("5.6e-14") 

결과

5 

대신에

0

14
parseIntfloat를 사용 하면 제대로 작동하지 않습니다. parseFloat이 경우 제대로 작동합니다.
benekastah

16

문자열을 정수로 변환하려면 parseFloat 및 NOT parseInt를 사용하는 것이 좋습니다 . 이유는 다음과 같습니다.

parseFloat 사용 :

parseFloat('2.34cms')  //Output: 2.34
parseFloat('12.5')     //Output: 12.5
parseFloat('012.3')    //Output: 12.3

parseInt 사용 :

parseInt('2.34cms')  //Output: 2
parseInt('12.5')     //Output: 12
parseInt('012.3')    //Output: 12

parseInt는 소수점 이하의 값을 버리는 반면, parseFloat를 사용하면 부동 소수점 숫자를 사용할 수 있으므로 소수점 이하의 값을 유지하려는 경우 더 적합합니다. 정수 값을 원하는 경우에만 parseInt를 사용하십시오.


6
질문은 "어떻게 자바 스크립트 문자열을 Integer로 변환합니까"이었다
피에르 Arlaud

15

또한 참고 사항 : Mootools에는 toInt () 함수가 있으며 모든 네이티브 문자열 (또는 float (또는 integer))에서 사용됩니다.

"2".toInt()   // 2
"2px".toInt() // 2
2.toInt()     // 2

7
세 번째 예제는 a를 발생시킵니다. 예를 들어 SyntaxError, 이중 점을 사용해야합니다. 예를 들어 2..toInt();첫 번째 점은 Number리터럴 표현을 끝내고 두 번째 점은 속성 접근 자입니다.
CMS

2
이 질문은 JavaScript에 관한 mootools가 아닙니다.
Liam

14

아래 예를 참조하십시오. 의심을 없애는 데 도움이됩니다.

Example                  Result

parseInt("4")            4
parseInt("5aaa")         5
parseInt("4.33333")      4
parseInt("aaa");         NaN (means "Not a Number")

parseint 함수를 사용하여 문자열이 아닌 정수만 표시합니다.


12

우리는 +(stringOfNumber)대신에 사용할 수 있습니다parseInt(stringOfNumber)

예 : +("21")와 같이 int 21을 반환합니다 parseInt("21").

이 단항 "+"연산자를 사용하여 float를 구문 분석 할 수도 있습니다.


1
그러나 수식에는 사용할 수 없습니다! 즉 (1 + ( "21")) * 10 === 1210!
Alexander Vasilyev

2
@AlexanderVasilyev 나는 당신이 할 수 있다고 생각합니다 +.
NiCk Newman

@NiCkNewman 우리가 언급 한 답변의 예에서 + ( "21")를 얻습니다.
Alexander Vasilyev

나는이 솔루션을 정말로 싫어한다. 그것은 분명하지 않습니다 parseInt. 일반적인 구현은 언뜻보기에 const myNumber = +myNumberAsAString표준 +=또는 =+연산자 처럼 보입니다 . 또한 잘못 사용하면 연결 오류가 발생할 수 있습니다. 이 솔루션은 숫자가 제공되지 않은 경우 0이 왼쪽으로 가정 된다는 사실을 기반으로합니다 .
Storm Muller

11

JavaScript에는 문자열을 숫자 값으로 변환하는 방법이 많이 있습니다 ... 간단하고 편리하게 하나가 작동하는 방식을 선택하십시오.

var num = Number("999.5"); //999.5
var num = parseInt("999.5", 10); //999
var num = parseFloat("999.5"); //999.5
var num = +"999.5"; //999.5

또한 모든 수학 연산은 예를 들어 숫자로 변환합니다.

var num = "999.5" / 1; //999.5
var num = "999.5" * 1; //999.5
var num = "999.5" - 1 + 1; //999.5
var num = "999.5" - 0; //999.5
var num = Math.floor("999.5"); //999
var num = ~~"999.5"; //999

필자가 선호하는 방법은 +부호를 사용하는 것인데, 이는 JavaScript에서 문자열을 숫자로 변환하는 우아한 방법입니다.


10

시도 str - 0변환 stringnumber.

> str = '0'
> str - 0
  0
> str = '123'
> str - 0
  123
> str = '-12'
> str - 0
  -12
> str = 'asdf'
> str - 0
  NaN
> str = '12.34'
> str - 0
  12.34

다음은 문자열을 int로 변환하는 여러 가지 방법의 성능을 비교하는 두 개의 링크입니다.

https://jsperf.com/number-vs-parseint-vs-plus

http://phrogz.net/js/string_to_number.html


1
@AlexanderYau,이 당 문서 는은 '1'으로 변환됩니다 1에 의해 ToNumber다음 1 - 01
zangw

8

구글은 결과적 으로이 대답을주었습니다.

실제로 C와 JavaScript 사이의 바인딩을 위해 문자열을 정수로 "저장"해야하므로 문자열을 정수 값으로 변환합니다.

/*
    Examples:
        int2str( str2int("test") ) == "test" // true
        int2str( str2int("t€st") ) // "t¬st", because "€".charCodeAt(0) is 8364, will be AND'ed with 0xff
    Limitations:
        max 4 chars, so it fits into an integer
*/
function str2int(the_str) {
    var ret = 0;
    var len = the_str.length;
    if (len >= 1) ret += (the_str.charCodeAt(0) & 0xff) <<  0;
    if (len >= 2) ret += (the_str.charCodeAt(1) & 0xff) <<  8;
    if (len >= 3) ret += (the_str.charCodeAt(2) & 0xff) << 16;
    if (len >= 4) ret += (the_str.charCodeAt(3) & 0xff) << 24;
    return ret;
}
function int2str(the_int) {
    var tmp = [
        (the_int & 0x000000ff) >>  0,
        (the_int & 0x0000ff00) >>  8,
        (the_int & 0x00ff0000) >> 16,
        (the_int & 0xff000000) >> 24
    ];
    var ret = "";
    for (var i=0; i<4; i++) {
        if (tmp[i] == 0)
            break;
        ret += String.fromCharCode(tmp[i]);
    }
    return ret;
}

4
4 바이트 값을 저장하고 검색하는 흥미로운 방법입니다. 숫자의 문자열 표현을 정수 값으로 변환하는 방법에 대한 일반적인 해석에는 대답하지 않습니다. 어쨌든, int2str바이트가 0이면 함수가 중지되는데, 이는 값 내의 합법적 요소 일 수 있으므로 if... break을 제거해야 완전한 4 바이트 값이 리턴됩니다.
Suncat2000

8

내 생각에 플로트를 구문 분석하면 오류가 발생하므로 모든 에지 사례에 대한 답변은 없습니다.

function parseInteger(value) {
    if(value === '') return NaN;
    const number = Number(value);
    return Number.isInteger(number) ? number : NaN;
}
parseInteger("4")            // 4
parseInteger("5aaa")         // NaN
parseInteger("4.33333")      // NaN
parseInteger("aaa");         // NaN

1
숫자를 반환하는 것은 플로트에 약간 공격적입니다.
Thomas Ayoub

2
그것은이다 parseInteger,하지 parseNumber. JS는 정수를 지원하지 않고 별도의 유형으로 부동 소수점이므로 모든 솔루션이 해결책이라고 생각합니다. 숫자 아님이 잘못된 경우, null대신에 돌아올 수 NaN있습니다.
Michał Knapik 2016 년

4

가장 쉬운 해결책은 다음과 같습니다.

let myNumber = "123" | 0;

더 쉬운 솔루션

let myNumber = +"123";

2

위의 모든 사항이 정확합니다. "typeot x === 'number'"를 수행하여 문자열의 숫자인지 확인하십시오. 그렇지 않으면 NaN을 반환합니다.

 var num = "fsdfsdf242342";
 typeof num => 'string';

 var num1 = "12423";
 typeof num1 => 'number';
 +num1 = > 12423`

v8.5.0 노드에서을 var num1 = "12423"; typeof num1;반환합니다 string.
에두 자모라

2

또 다른 옵션은 XOR 값을 두 배로 늘리는 것입니다.

var i = 12.34;
console.log('i = ' + i);
console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i));

출력됩니다 :

i = 12.34
i  i  i = 12

2

나는 문자열 앞에 하나의 더하기 (+)를 추가했는데 그게 해결책이었습니다!

+"052254" //52254

그것이 도움이되기를 바랍니다.)


2

10의 거듭 제곱으로 숫자의 곱셈을 합하면 다음과 같습니다.

즉 : 123 = 100 + 20 + 3 = 1 * 100 + 2 + 10 + 3 * 1 = 1 * (10 ^ 2) + 2 * (10 ^ 1) + 3 * (10 ^ 0)

function atoi(array) {

// use exp as (length - i), other option would be to reverse the array.
// multiply a[i] * 10^(exp) and sum

let sum = 0;

for (let i = 0; i < array.length; i++) {
    let exp = array.length-(i+1);
    let value = array[i] * Math.pow(10,exp);
    sum+=value;
}

return sum;

}


1

function doSth(){
  var a = document.getElementById('input').value;
  document.getElementById('number').innerHTML = toNumber(a) + 1;
}
function toNumber(str){
  return +str;
}
<input id="input" type="text">
<input onclick="doSth()" type="submit">
<span id="number"></span>


1

나는 이것을 사용한다

String.prototype.toInt = function (returnval) { 
    var i = parseInt(this);
    return isNaN(i) ? returnval !== undefined ? returnval : - 1  :      i; 
}

이렇게하면 항상 int를 다시 얻습니다.


1

유효한 정수를 얻는 가장 안전한 방법 :

let integer = (parseInt(value, 10) || 0);

예 :

// Example 1 - Invalid value:
let value = null;
let integer = (parseInt(value, 10) || 0);
// => integer = 0
// Example 2 - Valid value:
let value = "1230.42";
let integer = (parseInt(value, 10) || 0);
// => integer = 1230
// Example 3 - Invalid value:
let value = () => { return 412 };
let integer = (parseInt(value, 10) || 0);
// => integer = 0

1
function parseIntSmarter(str) {
    // ParseInt is bad because it returns 22 for "22thisendsintext"
    // Number() is returns NaN if it ends in non-numbers, but it returns 0 for empty or whitespace strings.
    return isNaN(Number(str)) ? NaN : parseInt(str, 10);
}

1

플러스를 사용할 수 있습니다 (예 : =>

var personAge = '24'; var personAge1 = (+ personAge)

당신은 사람의 나이를 볼 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.