数値の長さを確認するにはどうすればよいですか?


161

JavaScriptまたはjQueryで数値の長さを取得したいですか?

私はvalue.length成功せずに試しましたが、これを最初に文字列に変換する必要がありますか?


3
はい、それを文字列に変換します。数の「長さ」の概念は、いくつかの数表現スキームに関してのみ意味があります。
先のとがった

はい、最初に文字列に変換する必要があります。IE(1234).toString()。length
Osama Bari

上位3つの回答のベンチマーク:measurethat.net/Benchmarks/ShowResult/92276
Richie

回答:


304
var x = 1234567;

x.toString().length;

このプロセスはまたのためにFloat NumberそしてのためにExponential 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 2014

2
Awesme perf manありがとう。私が得た結果は数学の方法が速いことを示しています、これはあなたが得た結果ですか?これが私の結果です:i.imgur.com/9BKxyd3.png
Noitidart

1
@HubertGrzeskowiakああ、いいですね とにかく、その方法は基本的には数学の方法ですが、いくつかのスピードハックがあります。ドロップし、代わりにMath.ceil高速を使用しますMath.abs。しかし、正直に言って、Chromeでのパフォーマンスの向上は期待できませんでした。
MaxArt 2014年

3
完璧ですが、代わりに番号が0の場合は0を
返し

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 Webリソース。

私はいくつかのビット単位の演算が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は普遍的にサポートされているわけではないことに注意してください。


好奇心として、私はのtoString()対JsPerf NLENGTH有する方法を実行した長さをこれに....。jsperf.com/convert-number-to-string-and-get-length/2
イスラーフィールハビラ

ハハ、それは基本的に私が提供したソリューションです!こんなに上手くいくとは思いもしませんでした。
MaxArt 2014

2
申し訳ありませんが、私が解決策を発明したことについて何か言いましたか?投稿する前によく読んでみませんか?ちなみに、アルゴリズムはスティーブンウォルフラムが生まれる前に発見されただけでなく、リンクしたページはJavascriptでのソリューションを提供していませはあなたの9ヶ月前にそうしました。
MaxArt 2014

1
「+1」は、Math.abs呼び出しの外側にあるはずです:Math.log(Math.abs(n)+ 1)...
Hubert Grzeskowiak 2014年

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メタル

4

それを行うには3つの方法があります。

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)を使用する必要があります。読みやすさは常にスピードを上回ります。ただし、速度を重視する場合は、以下のとおりです。

速度が異なる3つの方法。

// 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.