JavaScriptで数値を文字列に変換する最良の方法は何ですか?


回答:


516

このような:

var foo = 45;
var bar = '' + foo;

実際、私は通常、単純な便宜のためにこのようにしていますが 1,000回を超える反復は生の速度で表示され、.toString()

ここでは、パフォーマンステストを参照してください(自分ではありませんが、自分で作成したときに見つかりました):http : //jsben.ch/#/ghQYR

上記のJSPerfテストに基づく最速: str = num.toString();

0.1秒で100万回変換できると考えると、速度の違いはそれほど大きくないことに注意してください。

更新:速度はブラウザによって大きく異なるようです。Chromeではnum + ''、このテストに基づいて最も高速であるようですhttp://jsben.ch/#/ghQYR

アップデート2:上記の私のテストに基づいて、Firefox 20.0.1の実行.toString()'' + numサンプルよりも約100倍遅いことに注意してください。


58
変換によって適切な回答'' + 123e-50が返されない場合があります"1.23e-48"
hongymagic 2013年

21
@hongymagic:その答えは実際に考えられる唯一のものです:数値はそれがどのように入力されたかを気にせず、知らず、標準の印刷表現はドットの前にちょうど1桁あります。
Svante、2015

4
私はjsben.ch/ghQYRでテストを実行しましたが、毎回異なる結果が表示されました!
マリアム・セイディ2017

2
null fooはエラーをスローしないので、私はこの答えが好きです。
ttugates

2
@MaryamSaeidi:使用drublicjsperf.com上記のテストは、より一貫性のようです。
Giraldi

364

私の意見でn.toString()は、その明快さのために賞をとっています、そしてそれが余分なオーバーヘッドを運ぶとは思いません。


最近のブラウザのバージョンでは重要ではありませんが、多少のオーバーヘッドがあります。Firefox Quantumでは少なくとも
peterchaula 2018

11
これは安全ではありません。nはnullまたは未定義の場合があります。
david.pfx 2018年

20
@ david.pfx質問は、数値を文字列に変換する方法を尋ねます。この回答で機能しない数値以外の値の例(nullなどundefined)を提供しても、「安全」ではありません。
Michael Martin-Smucker

5
@ MichaelMartin-Smucker:多くのJSを書くと、物事がめったに切り取られたり乾燥されたりすることはほとんどないことに気づきます。質問は開かれており、IMOは、実際にはnullまたは未定義の文字列の問題を少なくとも認めるべきです。YMMV。
david.pfx

@ david.pfx私はたくさんのjsを書きましたが、最後に文字列としての数値が必要だったのを覚えていません。文字列としての数値で十分でした。これが正解です。そこハンドリングへの答えはありませんnullundefined、それはアプリケーションの特定があるとして、私が想像しながら、(n || defaultNumber).toString() ほとんどの人が、私は強く、我々はすべての質問にそれを作業する必要があります同意しないような状況にしたいと思うものです。これは、数値を文字列に変換すること、優れたアーキテクチャ、および必要に応じて他の型変換を別のレッスンで行うことでした。
ジョージリース

73

明示的な変換は、その言語を初めて使用するユーザーにとって非常に明確です。他の人が示唆しているように、型強制を使用すると、開発者が強制ルールを認識していない場合にあいまいさが生じます。結局のところ、開発者の時間はCPU時間よりもコストがかかるので、後者を犠牲にして前者を最適化します。そうは言っても、この場合、違いはごくわずかですが、そうでない場合でも、この種のことを最適化する適切なJavaScriptコンプレッサーがいくつかあると私は確信しています。

だから、上記の理由で私は行くでしょう:n.toString()またはString(n)String(n)nnullまたは未定義の場合に失敗しないため、おそらくより良い選択です。


12
質問を約ない変換番号については、番号を変換する、またはされたnull、またはundefined。プログラムのバグである場合nnullまたはundefinedプログラムのバグが原因である場合、バグを見つけて修正する可能性を高めるために、プログラムがこの状態で失敗することを望みます。プログラムのクラッシュは、プログラマがバグを見つけやすくするための贈り物です:-)。代替策は、バグを注意深く見極めた上で、設計どおりに機能しないソフトウェアを提供することです。したがって、私はString(n)エラーをマスクするために使用するのが好きではありません。
マットウォリス

1
String(n)たとえば、アンダースコアの結合など、機能的なスタイルで使用するのに適してい_.compose(funcThatNeedsAStringParam, String)ます。
Rik Martins

2
String(null)はプログラムをクラッシュさせませんが、リテラル文字列「null」を返しますが、これはおそらく望んでいるものではありません。データが正当にnullである可能性がある場合は、明示的に処理する必要があります。
Peter Smartt 2017年

1
@MattWallisそれは回答者ではなく開発者の決定であるべきだと思いませんか?
forresthopkinsa

31

... JavaScriptのパーサーは、数値のドット表記を浮動小数点リテラルとして解析しようとします。

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

ソース


17

舌の頬は明らかに:

var harshNum = 108;
"".split.call(harshNum,"").join("");

または、ES6でテンプレート文字列を使用することもできます

var harshNum = 108;
`${harshNum}`;

ES6テンプレートでベンチマークを実行すると、'' + numberメソッドよりも高速であることが判明する場合もあります。つまり、これらのベンチマークの結果は、複数回実行すると大きく異なるため、あまりに深刻に受け止めるべきかどうかはわかりません。
Nico Van Belle

15

他の回答はすでに他のオプションをカバーしていますが、私はこれを好みます:

s = `${n}`

短く、簡潔で、他の多くの場所ですでに使用されている(最新のフレームワーク/ ESバージョンを使用している場合)ので、プログラマーなら誰でも理解できるはずです。

それは(通常)重要なことではありませんが、他の方法と比較して最速のようにも見えます


nが数値ではない場合も安全です。
david.pfx 2018年

しかし、そうではn.toString()ありませんか?
午前

1
@amn場合はnあるundefined、それは使用して構文エラーがスローされます.toString()
ジヨンモクの

これString(n)はすべての場合と同じ結果を与えるだけではないですか?唯一の違いは、あまり明確ではないということです。
ベネットマケルウィー

そしてずっと遅い。
エイドリアンバーソロミュー

12

変数を文字列に変換する最も簡単な方法は、その変数に空の文字列を追加することです。

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'

2
それは括弧内にする必要があることを注意:(5.41 + '')文字列のようなメソッドを使用する.substring()と、他の人を
Gjaa

なぜそれが注目される必要があるのですか?
エイドリアンバーソロミュー

7

通貨を表すなど、結果を特定の小数点以下の桁数フォーマットする必要がある場合は、メソッドのようなものが必要です。toFixed()

number.toFixed( [digits] )

digits 小数点以下の桁数です。


2
あなたそれが数であることを知らない限り、安全ではありませ
david.pfx 2018年

6

https://jsperf.comを使用して、以下のケースのテストケースを作成しました。

number + ''
`${number}`
String(number)
number.toString()

https://jsperf.com/number-string-conversion-speed-comparison

2018年7月24日の時点で、結果number + ''は、テンプレート文字列リテラルと連携するFirefoxのChromeの中で最速であるとしています。

両方String(number)、およびnumber.toString()最速オプションよりも約95%遅いです。

パフォーマンステスト、上記の説明


2

最初の2つは読みやすいので気に入っています。私は使いがちString(n)ですが、何よりもスタイルの問題です。

それはあなたがとしての行がない限りです

var n = 5;
console.log ("the number is: " + n);

それは非常に自明です


2

状況次第ではないかと思いますが、とにかく.toString()わかりやすいので、とにかく使えます。


2

.toString()は組み込み型キャスト関数であり、その詳細については専門家ではありませんが、組み込み型キャストと明示的な方法を比較するときは常に、組み込みの回避策が優先されます。


1

すべてを考慮する必要がある場合は、以下をお勧めします

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

IMHO、文字列に変換する最も速い方法。私が間違っていたら訂正してください。


1

考えられるほとんどすべての既存および将来のケース(入力は数値、null、未定義、シンボルなど)に対する唯一の有効なソリューションは、String(x)です。「ここでは数値を文字列に確実に変換し、ここではブール値を文字列に確実に変換する」のように、値型の仮定に基づいて、3つの方法で単純な操作を行わないでください。

説明:

String(x)null、undefined、Symbols、[anything]を処理し.toString()、オブジェクトを呼び出します。

'' + x.valueOf()x(数値へのキャスト)の呼び出し、Symbolsのスローは、実装に依存する結果を提供できます。

x.toString() nullおよび未定義をスローします。

注:などのString(x)プロトタイプのないオブジェクトでは引き続き失敗しますObject.create(null)

「Hello、undefined」などの文字列が気に入らない場合、またはプロトタイプのないオブジェクトをサポートする場合は、次の型変換関数を使用します。

/**
 * Safely casts any value to string. Null and undefined are converted to ''.
 * @param  {*} value
 * @return {string}
 */
function string (str) {
  return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}

1

数値リテラルでは、プロパティにアクセスするためのドットを小数点と区別する必要があります。これにより、数値リテラル123でString()を呼び出す場合は、次のオプションを使用できます。

123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()

1

以下はJSで整数を文字列に変換する方法です

メソッドは、パフォーマンスの高い順に並べられます。

(パフォーマンステストの結果は、@ DarckBlezzerの回答で示されています)

変数番号= 1

方法1:

num = `$ {num}`

方法2:

num = num + ''

方法3:

num = String(num)

方法4:

num = num.toString()

注: 数値からtostring()を直接呼び出すことはできません

例: 2.toString()はキャッチされないSyntaxErrorをスローします:無効または予期しないトークン




0

メソッドtoFixed()も目的を解決します。

var n = 8.434332;
n.toFixed(2)  // 8.43

0

Numberオブジェクトを呼び出してからを呼び出すことができますtoString()

Number.call(null, n).toString()

このトリックを別のJavaScriptネイティブオブジェクトに使用できます。


0

最近これに遭遇しただけで、方法3と4は、文字列がどのようにコピーされてまとめられるかという理由から適切ではありません。小さなプログラムの場合、この問題は重要ではありませんが、実際のWebアプリケーションでは、頻度の高い文字列操作を処理する必要があるこのアクションは、パフォーマンスと読みやすさに影響を与える可能性があります。

リンクはこちらです


0

時間があれば、これをより多くのデータで再編集します。現時点ではこれで問題ありません...

nodejs v8.11.2でのテスト:2018/06/06

let i=0;
    console.time("test1")
    for(;i<10000000;i=i+1){
    	const string = "" + 1234;
    }
    console.timeEnd("test1")
    
    i=0;
    console.time("test1.1")
    for(;i<10000000;i=i+1){
    	const string = '' + 1234;
    }
    console.timeEnd("test1.1")
    
    i=0;
    console.time("test1.2")
    for(;i<10000000;i=i+1){
    	const string = `` + 1234;
    }
    console.timeEnd("test1.2")
    
    i=0;
    console.time("test1.3")
    for(;i<10000000;i=i+1){
    	const string = 1234 +  '';
    }
    console.timeEnd("test1.3")
    
    
    i=0;
    console.time("test2")
    for(;i<10000000;i=i+1){
    	const string = (1234).toString();
    }
    console.timeEnd("test2")
    
    
    i=0;
    console.time("test3")
    for(;i<10000000;i=i+1){
    	const string = String(1234);
    }
    console.timeEnd("test3")
    
    
    i=0;
    console.time("test4")
    for(;i<10000000;i=i+1){
    	const string = `${1234}`;
    }
    console.timeEnd("test4")
    
    i=0;
    console.time("test5")
    for(;i<10000000;i=i+1){
    	const string = 1234..toString();
    }
    console.timeEnd("test5")
    
    i=0;
    console.time("test6")
    for(;i<10000000;i=i+1){
    	const string = 1234 .toString();
    }
    console.timeEnd("test6")

出力

test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms

イェイ-test4は私がいつも使っているものです!!
エイドリアンバーソロミュー

0

node.jsを使用した場合も同様の結果のようです。私はこのスクリプトを実行しました:

let bar;
let foo = ["45","foo"];

console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo;
}
console.timeEnd('string concat testing');


console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
    bar = String(foo);
}
console.timeEnd("string obj testing");

console.time("string both");
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo + "";
}
console.timeEnd("string both");

そして、次の結果を得た:

 node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

実行するたびに同じような時間。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.