JavaScript로 자릿수 얻기


124

내 게시물 제목에서 알 수 있듯이 몇 자릿수인지 알고 싶습니다 var number. 예 : number = 15;내 함수가 2. 현재는 다음과 같습니다.

function getlength(number) {
  return number.toString().length();
}

그러나 Safari는 다음과 같은 이유로 작동하지 않는다고 말합니다 TypeError.

'2' is not a function (evaluating 'number.toString().length()')

보시다시피 '2'실제로 올바른 솔루션입니다. 하지만 왜 그렇 not a function습니까?

답변:


229

length메서드가 아니라 속성입니다. 호출 할 수 없으므로 괄호가 필요하지 않습니다 ().

function getlength(number) {
    return number.toString().length;
}

업데이트 : 주석에서 논의했듯이 위의 예는 부동 숫자에 대해 작동하지 않습니다. 작동하도록하기 위해으로 마침표를 제거 String(number).replace('.', '').length하거나 정규식으로 숫자를 계산할 수 있습니다 : String(number).match(/\d/g).length.

속도 측면에서 잠재적으로 주어진 숫자에서 자릿수를 얻는 가장 빠른 방법은 수학적으로 수행하는 것입니다. 내용은 양의 정수 멋진 알고리즘이 있습니다 log10:

var length = Math.log(number) * Math.LOG10E + 1 | 0;  // for positive integers

모든 유형의 정수 (음수 포함)에 대해 @ Mwr247 의 훌륭하게 최적화 된 솔루션이 있지만 Math.log10많은 레거시 브라우저에서 지원되지 않으므로 사용시주의해야 합니다. 교체 그래서 Math.log10(x)함께하는 Math.log(x) * Math.LOG10E호환성 문제를 해결합니다.

부동 소수점 수학의 잘 알려진 동작 으로 인해 십진수에 대한 빠른 수학적 솔루션을 만드는 것은 쉽지 않으므로 문자열로 변환하는 방법이 더 쉽고 바보 같은 증거가 될 것입니다. @streetlogics에서 언급했듯이 간단한 숫자 대 문자열 연결로 빠른 캐스팅을 수행 할 수 있으므로 대체 솔루션이 다음과 같이 변환됩니다.

var length = (number + '').replace('.', '').length;  // for floats

3
자릿수를
구하는

@Swarnendu : 정수만 있기 때문에 문제가되지 않습니다.
bit4fox 2013

3
그렇지 않으면 그냥 number.toString().match(/\d/g).length.
VisioN

1
@Bakudan-이 답변은 수정 된 것으로 보입니다. 지금 그것을 비판하는 두 개의 댓글을 삭제할 수 있습니다 (미래 사람들이 혼동하지
않고이

1
@ 3ocene 좋은 추측! 값은 동일하게 유지되지만이면에서는 정수로 캐스팅됩니다. x | 0의 또 다른 짧고 빠른 버전으로 Math.floor(x)숫자를 반올림합니다. 을 사용하여 동일한 결과를 얻을 수 있습니다 ~~x. 다음 질문은 요점에 대한 자세한 설명을 제공합니다. stackoverflow.com/q/9049677/1249581 .
VisioN

66

다음은 수학적 대답입니다 (음수에도 적용됨).

function numDigits(x) {
  return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}

그리고 위의 최적화 된 버전 (보다 효율적인 비트 연산) :

function numDigits(x) {
  return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}

기본적으로 음수 값이 올바르게 작동 할 수 있도록 입력의 절대 값을 가져 오는 것으로 시작합니다. 그런 다음 log10 연산을 실행하여 입력의 10의 거듭 제곱을 제공합니다 (다른 밑에서 작업하는 경우 해당 밑에 대한 로그를 사용합니다), 즉 자릿수입니다. 그런 다음 출력을 플로어링하여 그 정수 부분 만 가져옵니다. 마지막으로 max 함수를 사용하여 10 진수 값을 수정하고 (0과 1 사이의 모든 분수 값은 음수 대신 1을 반환 함) 개수를 얻기 위해 최종 출력에 1을 더합니다.

위는 (예제 입력을 기반으로) 정수의 자릿수를 세고 싶다고 가정합니다 (따라서 12345 = 5, 따라서 12345.678 = 5). 값의 총 자릿수를 계산하려면 (12345.678 = 8) 위의 함수에서 'return'앞에 이것을 추가합니다.

x = Number(String(x).replace(/[^0-9]/g, ''));

3
참고 : Math.log10은 ES6 함수입니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tx3

2
@ Tx3 좋은 메모! 고맙게도 Math.LOG10EES1 이후 존재했기 때문에 Math.log(x) * Math.LOG10E호환성을 위해 작동합니다.
Mwr247

이 함수가 작동하지 않는다고 생각합니다 :```function numDigits (x) {return (Math.log10 ((x ^ (x >> 31))-(x >> 31)) | 0) + 1; }```numDigits (1234567891)-> 10 numDigits (12345678912)-> 9
lokhmakov

@lokhmakov 두 번째 숫자가 JavaScript의 최대 32 비트 정수 값을 초과하여 비트 연산자 (^, >>, |)가 올바르게 처리 할 수 ​​없기 때문입니다.
Mwr247

1
진실. JS는 max safe int에서만 작동하며 그 숫자는 거의 모든 사람이 필요한 것보다 훨씬 큽니다. 나는 매우 많은 수의 게임을 개발 중이며 그 제한으로 인해 최적화 된 코드를 사용할 수 없었고, 나중에 코드가 손상되지 않도록 비슷한 보트에있는 다른 사람을 구하기 위해 언급 할 것이라고 생각했습니다. 그건 그렇고 훌륭한 대답입니다.
Justin

20

이것이 "javascript get number of numbers"에 대한 Google 검색에서 나왔기 때문에 내부 캐스팅에 의존하는 더 짧은 대안이 있다는 것을 알려 드리고 싶었습니다.

var int_number = 254;
var int_length = (''+int_number).length;

var dec_number = 2.12;
var dec_length = (''+dec_number).length;

console.log(int_length, dec_length);

수율

3 4

4
그리고 빠른 jsperf는 이것이 훨씬 더 빠르다는 것을 보여줍니다 (예 : 10 배 이상) : jsperf.com/number-tostring-vs-number
Ledivin

노트! 점도 숫자로 계산합니다. (dec_number)
Sebastian Norr

2

숫자 (구분자 뒤)가 필요한 경우 숫자를 분할하고 두 번째 부분 (점 뒤)을 계산할 수 있습니다.

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}

2

var i = 1;
while( ( n /= 10 ) >= 1 ){ i++ }

23432          i = 1
 2343.2        i = 2
  234.32       i = 3
   23.432      i = 4
    2.3432     i = 5
    0.23432


1

나는 여전히 Javascript를 배우고 있지만 얼마 전에 C 에서이 함수를 생각해 냈습니다.이 함수는 문자열이 아닌 수학 및 while 루프를 사용하므로 Javascript를 위해 다시 작성했습니다. 아마도 이것은 재귀 적으로 수행 될 수 있지만 여전히 개념을 실제로 파악하지 못했습니다. (이것이 제가 생각 해낼 수있는 최선의 방법입니다. 얼마나 많은 숫자가 작동하는지 잘 모르겠습니다. 자릿수.

function count_digits(n) {
    numDigits = 0;
    integers = Math.abs(n);

    while (integers > 0) {
        integers = (integers - integers % 10) / 10;
        numDigits++;
    }
    return numDigits;
}

편집 : 정수 값에서만 작동


1

참고 : 이 함수는 소수점 평균 뒤의 숫자 를 무시 합니다 . 소수점으로 세고 싶다면 . 이 점을 직접 확인하십시오!Math.floor()

function digitCount ( num )
{
     return Math.floor( num.toString()).length;
}

 digitCount(2343) ;

// ES5 +

 const digitCount2 = num => String( Math.floor( Math.abs(num) ) ).length;

 console.log(digitCount2(3343))

기본적으로 여기서 무슨 일이 일어나고 있는지. toString()그리고 String()숫자를 문자열로 변환하는 동일한 내장 함수입니다. 일단 변환하면 내장 함수로 문자열의 길이를 찾을 수 있습니다 length.

경고 : 하지만이 기능은 음수에 대해 제대로 작동하지 않을 것입니다. 음수로 재생하려는 경우이 답변확인 하거나 간단히 입력 Math.abs()하십시오.

응원하세요!


1
`You can do it by simple loop using Math.trunc() function. if in interview interviewer ask to do it without converting it into string`
    let num = 555194154234 ;
    let len = 0 ;
    const numLen = (num) => {
     for(let i = 0; i < num ||  num == 1 ; i++){
        num = Math.trunc(num/10);
        len++ ;
     }
      return len + 1 ;
    }
    console.log(numLen(num));

0

두 자리 : ECMAScript 6 (ES6)에서 두 자리 이상의 숫자가 필요한 경우 간단한 기능 :

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;

0

문제 설명 : string.length () jsfunction을 사용하지 않는 숫자 / 문자열을 계산합니다. 솔루션 : Forloop를 통해이를 수행 할 수 있습니다. 예 :

for (x=0; y>=1 ; y=y/=10){
  x++;
}

if (x <= 10) {
  this.y = this.number;                
}   

else{
  this.number = this.y;
}    

}


0

여기 내 해결책이 있습니다. 양수와 음수로 작동합니다. 도움이 되었기를 바랍니다

function findDigitAmount(num) {

   var positiveNumber = Math.sign(num) * num;
   var lengthNumber = positiveNumber.toString();

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4

0

길이를 얻는 것은 간단합니다.

  `${NUM}`.length

여기서 NUM은 길이를 구할 숫자입니다.


0

이 트릭에서 사용할 수 있습니다.

(''+number).length


0

숫자의 길이를 구하려면 다음 표현식을 사용하십시오.

length = variableName.toString().length

-7

length 속성은 문자열의 길이 (문자 수)를 반환합니다.

빈 문자열의 길이는 0입니다.

var str = "Hello World!";
var n = str.length;

n의 결과는 다음과 같습니다. 12

    var str = "";
    var n = str.length;

n의 결과는 다음과 같습니다. 0


배열 길이 속성 :


length 속성은 배열의 요소 수를 설정하거나 반환합니다.

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.length;

결과는 다음과 같습니다. 4

통사론:

배열의 길이를 반환합니다.

array.length

배열 길이 설정 :

array.length=number

2
이 질문에 응답하지 않습니다
스티브 테일러에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.