Bentuk numerik yang disebut adalah menambahkan koma antara setiap tiga digit mulai dari satu digit. Misalnya, "10.000". Untuk mengatasi persyaratan ini, saya awalnya menulis fungsi seperti ini:
Salinan kode adalah sebagai berikut:
// Metode 1
fungsi tothouse (num) {
var result = [], counter = 0;
num = (num || 0) .toString (). split ('');
untuk (var i = num.length-1; i> = 0; i--) {
Counter ++;
result.unshift (num [i]);
if (! (counter % 3) && i! = 0) {result.unshift (','); }
}
return result.join ('');
}
Proses eksekusi metode satu adalah untuk mengubah angka menjadi string, memecahnya menjadi array, dan kemudian mulai dari akhir, masukkan elemen dalam array ke awal array baru (hasil). Setiap kali elemen dimasukkan, penghitung menghitung angka (tambahkan 1). Ketika konter adalah kelipatan 3, koma dimasukkan, tetapi berhati -hatilah bahwa tidak ada koma yang dibutuhkan di awal (ketika saya adalah 0). Akhirnya, hasilnya diperoleh dengan memanggil metode bergabung dari array baru.
Metode ini lebih jelas dan lebih mudah dipahami, dan juga digunakan dalam proyek untuk sementara waktu. Tapi intuisi memberi tahu saya bahwa itu tidak berkinerja baik.
Metode 2 - Versi String dari Metode 1
Salinan kode adalah sebagai berikut:
// Metode 2
fungsi tothouse (num) {
var result = '', counter = 0;
num = (num || 0) .toString ();
untuk (var i = num.length-1; i> = 0; i--) {
Counter ++;
hasil = num.charat (i) + hasil;
if (! (counter % 3) && i! = 0) {result = ',' + hasil; }
}
hasil pengembalian;
}
Metode 2 adalah versi yang ditingkatkan dari Metode 1. Ini tidak memecah string menjadi array, dan selalu beroperasi pada string.
Metode 3 - Loop cocok dengan tiga angka di akhir
Salinan kode adalah sebagai berikut:
// Metode 3
fungsi tothouse (num) {
var num = (num || 0) .toString (), re = // d {3} $/, result = '';
while (re.test (num)) {
Hasil = Regexp.LastMatch + hasil;
if (num! == RegExp.LastMatch) {
hasil = ',' + hasil;
num = regexp.leftcontext;
} kalau tidak {
num = '';
merusak;
}
}
if (num) {result = num + hasil; }
hasil pengembalian;
}
Metode 3 adalah algoritma yang sama sekali berbeda. Tiga angka di akhir dicocokkan melalui loop ekspresi reguler. Setiap kali pertandingan dicocokkan, koma dan konten yang cocok dimasukkan pada awal string hasil, dan kemudian target pencocokan (NUM) ditugaskan ke konten yang belum cocok (regexp.leftcontext). Selain itu, harap dicatat:
1. Jika jumlah digit adalah kelipatan dari 3, pertandingan terakhir harus tiga angka, tetapi tidak perlu menambahkan koma sebelum tiga angka pertama;
2. Jika jumlah bit angka bukan kelipatan 3, maka variabel NUM pasti akan memiliki 1 hingga 2 angka yang tersisa pada akhirnya. Setelah loop, angka yang tersisa harus dimasukkan pada awal string hasil.
Meskipun metode tiga mengurangi jumlah loop (tiga karakter diproses pada suatu waktu), konsumsi meningkat sampai batas tertentu karena penggunaan ekspresi reguler.
Metode 4 - Versi String dari Metode 3
Salinan kode adalah sebagai berikut:
// Metode 4
fungsi tothouse (num) {
var num = (num || 0) .toString (), result = '';
while (num.length> 3) {
hasil = ',' + num.slice (-3) + hasil;
num = num.slice (0, num.length - 3);
}
if (num) {result = num + hasil; }
hasil pengembalian;
}
Faktanya, fungsi mencegat tiga karakter terakhir dapat dicapai melalui metode irisan, substr atau substring dari jenis string. Ini menghindari ekspresi reguler.
Metode 5 - Metode Kombinasi dan Konvergensi
Salinan kode adalah sebagai berikut:
// Metode 5
fungsi tothouse (num) {
var num = (num || 0) .toString (), temp = num.length % 3;
switch (temp) {
Kasus 1:
num = '00' + num;
merusak;
Kasus 2:
num = '0' + num;
merusak;
}
return num.match (// d {3}/g) .join (','). Ganti (/^0+/, '');
}
Pertama, buat jumlah digit menjadi kelipatan 3, potong menjadi kelompok dari setiap tiga angka melalui ekspresi reguler, kemudian tambahkan koma melalui metode gabungan, dan akhirnya hapus komplemen 0.
Metode 6 - Metode Malas
Salinan kode adalah sebagai berikut:
// Metode 6
fungsi tothouse (num) {
return (num || 0) .toString (). Ganti (/(/d) (? = (?:/d {3})+$)/g, '$ 1,');
}
Saya selalu merasa bahwa pemformatan ini dapat dilakukan dengan penggantian ekspresi reguler, tetapi saya perlu menggunakan pernyataan dan metode penulisan lainnya, tetapi saya tidak terbiasa dengan bagian ini. Setelah mencari di Google, saya menemukan ekspresi reguler, yang mungkin merupakan implementasi kode terpendek.
Hasil tes
| nomor | Waktu yang dihabiskan untuk 5000 kali (MS) | |||||
|---|---|---|---|---|---|---|
| Metode 1 | Metode 2 | Metode 3 | Metode 4 | Metode 5 | Metode 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 | dua puluh satu | 4 | 3 | 1 | 6 | 3 |
| 100000 | dua puluh satu | 3 | 2 | 1 | 5 | 6 |
Perbandingan yang kuat antara Metode 1 dan Metode 2 menunjukkan bahwa efisiensi operasi string jauh lebih tinggi daripada operasi array; Hasil tes metode 6 memberi tahu kami bahwa panjang kode tidak ada hubungannya dengan kinerja. Metode 4 memiliki kinerja komprehensif terbaik (tetapi mengapa NUM berkurang ketika 100 NUM benar -benar tidak dapat diselesaikan), alasan utamanya adalah:
1. Bandingkan metode 1 dan 2, beroperasi 3 karakter, bukan 1 karakter setiap kali untuk mengurangi jumlah loop;
2. Metode perbandingan 3, 5, dan 6, tanpa menggunakan ekspresi reguler, mengurangi konsumsi.
Akhirnya, saya memilih metode empat sebagai solusi optimasi akhir. Pembaca dapat berkomentar jika mereka memiliki metode atau saran implementasi yang lebih baik.