숫자의 길이는 어떻게 알 수 있습니까?


161

JavaScript 또는 jQuery에서 숫자의 길이를 찾고 있습니까?

나는 value.length성공하지 않고 시도했지만 이것을 먼저 문자열로 변환해야합니까?


3
예, 문자열로 변환하십시오. 숫자 "길이"의 개념은 일부 숫자 표현 체계의 관점에서만 의미가 있습니다.
Pointy

예, 먼저 문자열로 변환해야합니다. IE (1234) .toString (). length
Osama Bari

상위 3 개 답변에 대한 벤치 마크 : measurethat.net/Benchmarks/ShowResult/92276
Richie Bendall

답변:


304
var x = 1234567;

x.toString().length;

이 프로세스는 또한 효과 Float NumberExponential number있습니다.


9
+1했습니다. 누군가에게 분명하지 않은 경우 부동 소수점의 소수점은 문자열 길이로 계산됩니다. 예 : 2.5.toString (). length 출력 3.
dading84

1
@ dading84 : Math.floor ()가 다음과 같이 수정한다고 생각합니다. Math.floor (99.5454) .toString (). length === 2
Manfred

7
이 솔루션은 20 자리를 초과하는 큰 숫자 나 작은 숫자로는 작동하지 않습니다. 예. 1.2e + 22 toString (). length 출력 7
CherylG

또한 이것은 매우 느립니다. 노드에서 테스트를했는데 Arturs의 답변보다 1200 % 이상 느립니다.
Oliver Dixon

1
좋은 해결책이 아닙니다. 예 : const val = 0295; const x = val.toString (). length; console.log (x) // 출력 : 3
karolkarp

82

좋아, 많은 답변이 있지만 이것은 재미를 위해 또는 수학이 중요하다는 것을 기억하기위한 순수한 수학입니다.

var len = Math.ceil(Math.log(num + 1) / Math.LN10);

이것은 실제로 지수 형식 인 경우에도 숫자의 "길이"를 제공합니다. num음수가 아닌 경우, 음수가 아닌 경우 절대 값을 취한 후 부호를 조정하십시오.

ES2015 업데이트

이제는 Math.log10일입니다 . 간단히 쓸 수 있습니다.

const len = Math.ceil(Math.log10(num + 1));

1
나는이 순수한 수학이 가장 효율적이고 빠르다고 생각합니다.
Noitidart

2
감사합니다. 내가 얻은 결과는 수학 방식이 빠르다는 것을 보여줍니다. 이것이 당신이 얻은 결과입니까? 여기 내 결과입니다 : i.imgur.com/9BKxyd3.png
Noitidart

1
@HubertGrzeskowiak 아 그거 좋네요. 어쨌든 방법은 기본적으로 수학이지만, 일부 속도 해킹이 있습니다. a를 떨어 뜨리고 대신 Math.ceil더 빠르게 Math.abs사용합니다. 하지만 솔직히 Chrome의 성능 향상을 기대하지는 못했습니다 ...
MaxArt

3
완벽하지만, 대신 숫자가 0 인 경우 0을 제공합니다.
StateLess

1
1e + 16 이상에서는 1을 줄이므로 10000000000000000은 17 대신 16을 반환합니다.
Goty Metal

12

node.js 에서이 기능을 사용 해왔으며 지금까지 가장 빠른 구현입니다.

var nLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1; 
}

양수와 음수를 지수 형식으로 처리해야하며 정수 부분의 길이를 부동 수로 반환해야합니다.

다음 참조는이 방법에 대한 통찰력을 제공해야합니다. Weisstein, Eric W. "Number Length." MathWorld--Wolfram 웹 리소스에서.

비트 비트 연산이 Math.abs를 대체 할 수 있다고 생각하지만 jsperf는 Math.abs가 대다수의 js 엔진에서 제대로 작동한다는 것을 보여줍니다.

업데이트 : 의견에서 언급 했듯이이 솔루션에는 몇 가지 문제가 있습니다.

Update2 (해결 방법) : 어느 시점에서 정밀도 문제가 발생하고 Math.log(...)*0.434...예상치 못한 동작이 발생한다고 생각합니다 . 그러나 Internet Explorer 또는 모바일 장치가 차 한잔이 아닌 경우이 작업을 Math.log10기능으로 대체 할 수 있습니다 . Node.js에서 함수 nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;를 사용 Math.log10하여 예상대로 작동 하는 빠른 기본 테스트를 작성 했습니다. 주의하시기 바랍니다 Math.log10보편적으로 지원되지 않습니다.


호기심으로 나는 이것에 nLength 메소드 대 toString (). length를 사용하여 JsPerf를 수행했습니다 .... jsperf.com/convert-number-to-string-and-get-length/2
Israfil Havilah

하하, 기본적으로 내가 제공 한 솔루션입니다! 나는 그것이 그렇게 잘 수행 될 수 있는지 전혀 몰랐다.
MaxArt

2
죄송합니다 . 솔루션이나 그와 비슷한 것을 발명 한 것에 대해 말했 습니까? 게시하기 전에주의 깊게 읽으십시오. 문제의 경우, 스티븐 볼프람이 태어나 전에 algorhythm는 방법을 발견했다, 어쨌든 당신이 링크 된 페이지가 않습니다 하지 자바 스크립트의 솔루션을 제공합니다. 나는 9개월 전에,했다.
MaxArt

1
"+1"은 Math.abs 호출 외부에있을 것입니다. Math.log (Math.abs (n) + 1) ...
Hubert Grzeskowiak

1
1e + 16 이상에서는 1을 줄이므로 10000000000000000은 17 대신 16을 반환합니다.
Goty Metal

11

길이를 얻으려면 숫자를 문자열로 만들어야합니다.

var num = 123;

alert((num + "").length);

또는

alert(num.toString().length);

9

템플릿 문자열을 사용할 수도 있습니다.

const num = 123456
`${num}`.length // 6

이것은 0으로 시작하는 숫자를 셀 수 있기 때문에 저에게 맞는 유일한 답변입니다.
jessiPP

5

정수를 문자열로 변환하지 않으면 펑키 루프를 만들 수 있습니다.

var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
     ++length;
     i = Math.floor(i/10);
}

alert(length);​

데모 : http://jsfiddle.net/maniator/G8tQE/


3
@Pointy 네, 정수를 가정 합니다. 문자열로 만들더라도 .계산의 일부로 포함 됩니다.
Naftali 일명 Neal

예, 점이 "길이"에 포함되어야하는지에 대한 흥미로운 철학적 질문이지만 :-)
Pointy

4

먼저 문자열로 변환하십시오.

var mynumber = 123;
alert((""+mynumber).length);

빈 문자열을 추가하면 암시 적 mynumber으로 문자열로 바뀝니다.


1
5를 반환하는 1e + 16과 같은 지수에서는 작동하지 않습니다.
Goty Metal

4

세 가지 방법이 있습니다.

var num = 123;
alert(num.toString().length);

더 나은 성능 하나 (ie11에서 최고의 성능)

var num = 123;
alert((num + '').length);

수학 (Chrome에서는 최상의 성능, Firefox는 있지만 IE11에서는 가장 느림)

var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)

여기에 jspref가 있습니다 http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2


4

가장 간단한 것 (stringLength)을 사용해야합니다. 가독성은 항상 속도를 능가합니다. 그러나 속도에 관심이 있다면 여기에 몇 가지가 있습니다.

속도가 다른 세 가지 방법.

// 34ms
let weissteinLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}

// 350ms
let stringLength = function(n) {
    return n.toString().length;
}

// 58ms
let mathLength = function(n) {
    return Math.ceil(Math.log(n + 1) / Math.LN10);
}

// Simple tests below if you care about performance.

let iterations = 1000000;
let maxSize = 10000;

// ------ Weisstein length.

console.log("Starting weissteinLength length.");
let startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    weissteinLength(Math.random() * maxSize);
}

console.log("Ended weissteinLength length. Took : " + (Date.now() - startTime ) + "ms");


// ------- String length slowest.

console.log("Starting string length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    stringLength(Math.random() * maxSize);
}

console.log("Ended string length. Took : " + (Date.now() - startTime ) + "ms");


// ------- Math length.

console.log("Starting math length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    mathLength(Math.random() * maxSize);
}

3

테스트에서 비슷한 질문을 받았습니다.

문자열로 변환하지 않고 숫자 길이 찾기

const numbers = [1, 10, 100, 12, 123, -1, -10, -100, -12, -123, 0, -0]

const numberLength = number => {

  let length = 0
  let n = Math.abs(number)

  do {
    n /=  10
    length++
  } while (n >= 1)

  return length
}

console.log(numbers.map(numberLength)) // [ 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 1 ]

음수는 조금 더 복잡해 지므로 Math.abs ()입니다.


2

정수에 꽤 좋은 @Neal 답변을 수정하고 싶지만 이전의 경우 숫자 1은 길이 0을 반환합니다.

function Longueur(numberlen)
{
    var length = 0, i; //define `i` with `var` as not to clutter the global scope
    numberlen = parseInt(numberlen);
    for(i = numberlen; i >= 1; i)
    {
        ++length;
        i = Math.floor(i/10);
    }
    return length;
}


0

예, 길이를 찾으려면 문자열로 변환해야합니다.

var x=100;// type of x is number
var x=100+"";// now the type of x is string
document.write(x.length);//which would output 3.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.