いわゆる数値形式は、1桁から始まる3桁ごとにコンマを追加することです。たとえば、「10,000」。この要件に対処するために、私は最初に次のような関数を書きました:
コードコピーは次のとおりです。
//方法1
function tothounthers(num){
var result = []、counter = 0;
num =(num || 0).toString()。split( '');
for(var i = num.length-1; i> = 0; i-){
カウンター++;
result.unshift(num [i]);
if(!(counter%3)&& i!= 0){result.unshift( '、'); }
}
return result.join( '');
}
方法1の実行プロセスは、数値を文字列に変換し、それらを配列に分割し、最後から開始し、配列の要素を新しい配列の先頭に挿入することです(結果)。要素が挿入されるたびに、カウンターは数をカウントします(1を追加)。カウンターが3の倍数である場合、コンマが挿入されますが、最初はコンマが必要ないことに注意してください(Iの場合)。最後に、結果は新しい配列の結合方法を呼び出すことによって取得されます。
この方法はより明確で理解しやすく、しばらくの間プロジェクトでも使用されていました。しかし、直感は、それがうまく機能していないことを教えてくれます。
方法2-方法1の文字列バージョン
コードコピーは次のとおりです。
//方法2
function tothounthers(num){
var result = ''、counter = 0;
num =(num || 0).toString();
for(var i = num.length-1; i> = 0; i-){
カウンター++;
result = num.charat(i) + result;
if(!(counter%3)&& i!= 0){result = '、' + result; }
}
返品結果;
}
方法2は、方法1の改良バージョンです。文字列を配列に分割することはなく、常に文字列で動作します。
方法3-ループは最後の3つの数値と一致します
コードコピーは次のとおりです。
//方法3
function tothounthers(num){
var num =(num || 0).toString()、re = // d {3} $/、result = '';
while(re.test(num)){
result = regexp.lastmatch + result;
if(num!== regexp.lastmatch){
result = '、' + result;
num = regexp.leftcontext;
} それ以外 {
num = '';
壊す;
}
}
if(num){result = num + result; }
返品結果;
}
方法3はまったく異なるアルゴリズムです。最後の3つの数値は、正規表現ループを介して一致します。一致するたびに、コンマとマッチングコンテンツが結果文字列の先頭に挿入され、一致するターゲット(num)がまだ一致していないコンテンツに割り当てられます(regexp.leftcontext)。さらに、注意してください:
1.数字の数が3の倍数である場合、最後の一致は3つの数字でなければなりませんが、最初の3つの数字の前にコンマを追加する必要はありません。
2.数のビット数が3の倍数でない場合、num変数は間違いなく1〜2の数値が残っています。ループの後、結果文字列の先頭に残りの数値を挿入する必要があります。
方法3では、ループの数(3つの文字が一度に処理されます)を減らしますが、正規表現の使用により、消費量はある程度増加します。
方法4-方法3の文字列バージョン
コードコピーは次のとおりです。
//方法4
function tothounthers(num){
var num =(num || 0).toString()、result = '';
while(num.length> 3){
result = '、' + num.slice(-3) + result;
num = num.slice(0、num.length -3);
}
if(num){result = num + result; }
返品結果;
}
実際、最後の3文字を傍受する機能は、文字列タイプのスライス、サブストリー、またはサブストリング法を通じて達成できます。これにより、正規表現が回避されます。
方法5-組み合わせおよび収束方法
コードコピーは次のとおりです。
//方法5
function tothounthers(num){
var num =(num || 0).toString()、temp = num.length%3;
switch(temp){
ケース1:
num = '00' + num;
壊す;
ケース2:
num = '0' + num;
壊す;
}
num.match(// d {3}/g).jein( '、')。置換(/^0+/、 '');
}
最初に、3の倍数に数字を構成し、正規表現を介して3つの数字ごとにグループにカットし、結合メソッドを介してコンマを追加し、最終的に補数0を削除します。
方法6-怠zyな方法
コードコピーは次のとおりです。
//方法6
function tothounthers(num){
return(num || 0).toString()。置換(/(/d)(?=(?:/d {3})+$)/g、 '$ 1、');
}
私は常に、このフォーマットは正規表現の代替品によって行うことができると感じていますが、アサーションやその他の執筆方法を使用する必要がありますが、この部分には精通していません。グーグルで検索した後、私はそのような正規表現を見つけました。これはおそらくコードの最も短い実装です。
テスト結果
| 番号 | 5000回(MS)に費やした時間 | |||||
|---|---|---|---|---|---|---|
| 方法1 | 方法2 | 方法3 | 方法4 | 方法5 | 方法6 | |
| 1 | 4 | 1 | 3 | 1 | 14 | 2 |
| 10 | 14 | 1 | 3 | 0 | 7 | 2 |
| 100 | 12 | 1 | 2 | 4 | 5 | 3 |
| 1000 | 13 | 2 | 3 | 2 | 9 | 5 |
| 10000 | 21 | 4 | 3 | 1 | 6 | 3 |
| 100000 | 21 | 3 | 2 | 1 | 5 | 6 |
方法1と方法2の強い比較は、文字列操作の効率が配列操作の効率よりもはるかに高いことを示しています。方法6のテスト結果は、コードの長さがパフォーマンスとは何の関係もないことを示しています。方法4には、最高の包括的なパフォーマンスがあります(ただし、100 numが本当に解決できないのに、なぜnumが減少するのか)、主な理由は次のとおりです。
1.メソッド1と2を比較すると、ループの数を減らすために毎回1文字ではなく3文字を操作します。
2。比較方法3、5、および6、正規表現を使用せずに消費を削減します。
最後に、最終的な最適化ソリューションとしてメソッド4を選択しました。読者は、より良い実装方法や提案があるかどうかをコメントできます。