Apa cara yang disarankan untuk mengisi ulang nilai dalam JavaScript? Saya membayangkan saya bisa membangun fungsi khusus untuk menempatkan nol pada nilai yang diketikkan, tetapi saya bertanya-tanya apakah ada cara yang lebih langsung untuk melakukan ini?
Catatan: Dengan "zerofilled" yang saya maksudkan dalam arti kata database (di mana representasi 6 digit dari angka 5 adalah "000005").
javascript
zerofill
Wilco
sumber
sumber
npm install sprintf-js
, dansprintf('%0d6', 5);
function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;}
... dengan asumsin
tidak negatifwhile
mengaksesn.length
mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Jawaban:
Yang Anda butuhkan hanyalah fungsi sederhana
Anda bisa memanggang ini ke perpustakaan jika Anda ingin menghemat namespace atau apa pun. Seperti dengan ekstensi jQuery .
sumber
Cara sederhana. Anda bisa menambahkan perkalian string untuk pad dan mengubahnya menjadi fungsi.
Sebagai suatu fungsi,
sumber
paddy (888, 2)
hasil88
dan tidak888
sesuai kebutuhan. Jawaban ini juga tidak menangani angka negatif.Saya tidak percaya semua jawaban rumit di sini ... Gunakan saja ini:
sumber
Saya benar-benar harus datang dengan sesuatu seperti ini baru-baru ini. Saya pikir pasti ada cara untuk melakukannya tanpa menggunakan loop.
Inilah yang saya pikirkan.
Maka cukup gunakan itu memberikan angka ke nol pad:
Jika angkanya lebih besar dari padding, angkanya akan meluas melampaui padding:
Desimal juga baik-baik saja!
Jika Anda tidak keberatan mencemari namespace global, Anda dapat menambahkannya ke Number secara langsung:
Dan jika Anda lebih suka desimal, gunakan tempat di padding:
Bersulang!
XDR datang dengan variasi logaritmik yang tampaknya berkinerja lebih baik.
PERINGATAN : Fungsi ini gagal jika num sama dengan nol (mis. Zeropad (0, 2))
Berbicara tentang kinerja, ibu membandingkan 3 jawaban teratas ( 4 dengan variasi log ). Tebak mana yang majorly mengungguli dua lainnya? :)
sumber
numZeros
parameternya, karena itu menyesatkan. Ini bukan jumlah nol yang ingin Anda tambahkan, itu adalah panjang minimum jumlah yang seharusnya. Nama yang lebih baik akannumLength
atau bahkanlength
.num
bisa nol ...Inilah yang saya gunakan untuk memasukkan angka hingga 7 karakter.
Pendekatan ini mungkin cukup bagi kebanyakan orang.
Sunting: Jika Anda ingin membuatnya lebih umum, Anda dapat melakukan ini:
Sunting 2: Perhatikan bahwa sejak ES2017 Anda dapat menggunakan
String.prototype.padStart
:sumber
number = 123456789
, dengan kode di atas, misalnya.new String
. Anda bisa menggunakan string literal.(new Array(padding + 1).join("0")
dapat diganti dengan"0".repeat(padding)
Browser modern sekarang mendukung
padStart
, Anda sekarang dapat melakukannya:Contoh:
sumber
Sayangnya, ada banyak saran rumit yang tidak perlu untuk masalah ini, biasanya melibatkan penulisan fungsi Anda sendiri untuk melakukan manipulasi matematika atau string atau memanggil utilitas pihak ketiga. Namun, ada cara standar untuk melakukan ini di pustaka JavaScript dasar hanya dengan satu baris kode. Mungkin pantas untuk membungkus satu baris kode ini dalam suatu fungsi untuk menghindari keharusan menentukan parameter yang tidak ingin Anda ubah seperti nama atau gaya lokal.
Ini akan menghasilkan nilai "005" untuk teks. Anda juga dapat menggunakan fungsi toLocaleString dari Angka untuk membuat angka nol di sebelah kanan titik desimal.
Ini akan menghasilkan nilai "5,00" untuk teks. Ubah useGrouping menjadi true untuk menggunakan pemisah koma untuk ribuan.
Perhatikan bahwa penggunaan
toLocaleString()
denganlocales
danoptions
argumen distandarisasi secara terpisah dalam ECMA-402 , bukan dalam ECMAScript. Sampai hari ini, beberapa browser hanya menerapkan dukungan dasar , yaitutoLocaleString()
dapat mengabaikan argumen apa pun.Contoh Lengkap
sumber
Jika nomor pengisian diketahui sebelumnya tidak melebihi nilai tertentu, ada cara lain untuk melakukan ini tanpa loop:
Uji kasus di sini: http://jsfiddle.net/jfriend00/N87mZ/
sumber
-88
harus menghasilkan"-00088"
, misalnya.zeroFill(-88, 5)
harus menghasilkan-00088
atau-0088
? Saya kira itu tergantung pada apakah Anda inginwidth
argumen menjadi seluruh lebar angka atau hanya jumlah digit (tidak termasuk tanda negatif). Seorang pelaksana dapat dengan mudah mengubah perilaku untuk tidak menyertakan tanda negatif dengan hanya menghapus--width
baris kode.Cara cepat dan kotor:
Untuk x = 5 dan hitung = 6 Anda akan memiliki y = "000005"
sumber
y="0005"
dengan di atas,y = (new Array(count + 1 - x.toString().length)).join('0') + x;
adalah apa yang memberi sayay="000005"
('0000'+n).slice(-4)
Inilah fungsi cepat yang saya buat untuk melakukan pekerjaan itu. Jika ada yang memiliki pendekatan yang lebih sederhana, silakan berbagi!
sumber
for
.vs.while
kinerja tidak cukup berbeda untuk menjadi menarik: jsperf.com/fors-vs-while/34Terlambat ke pesta di sini, tetapi saya sering menggunakan konstruk ini untuk melakukan ad-hoc padding dengan nilai tertentu
n
, yang dikenal sebagai positif, desimal:Dimana
offset
10 ^^ digit.Misalnya Padding hingga 5 digit, di mana n = 123:
Versi hexidecimal dari ini sedikit lebih bertele-tele:
Catatan 1: Saya suka solusi @ profitehlolz juga, yang merupakan versi string ini, menggunakan fitur indeks negatif slice () yang bagus.
sumber
Saya benar-benar tidak tahu mengapa, tetapi tidak ada yang melakukannya dengan cara yang paling jelas. Ini implementasi saya.
Fungsi:
Prototipe:
Sangat mudah, saya tidak bisa melihat bagaimana ini bisa lebih sederhana. Untuk beberapa alasan, saya sudah sering melihat SO, orang-orang hanya berusaha menghindari 'untuk' dan 'sambil' mengulangi dengan cara apa pun. Menggunakan regex mungkin akan membutuhkan biaya lebih banyak siklus untuk padding 8 digit sepele seperti itu.
sumber
Saya menggunakan snipet ini untuk mendapatkan representasi 5 digit
sumber
ECMAScript 2017: gunakan padStart atau padEnd
Info lebih lanjut:
sumber
Kekuatan Matematika!
x = integer ke pad
y = jumlah nol untuk pad
sumber
Saya tidak melihat ada yang menunjukkan fakta bahwa ketika Anda menggunakan String.prototype.substr () dengan angka negatif itu dihitung dari kanan.
Solusi satu liner untuk pertanyaan OP, representasi 6 digit dari nomor 5, adalah:
Generalisasi kita akan mendapatkan:
sumber
Setelah, lama, lama menguji 15 fungsi / metode berbeda yang ditemukan dalam jawaban pertanyaan ini, saya sekarang tahu mana yang terbaik (yang paling fleksibel dan tercepat).
Saya mengambil 15 fungsi / metode dari jawaban pertanyaan ini dan membuat skrip untuk mengukur waktu yang diperlukan untuk menjalankan 100 pembalut. Setiap pad akan pad nomor
9
dengan2000
nol. Ini mungkin tampak berlebihan, dan memang begitu, tetapi memberi Anda ide bagus tentang penskalaan fungsi.Kode yang saya gunakan dapat ditemukan di sini: https://gist.github.com/NextToNothing/6325915
Jangan ragu untuk memodifikasi dan menguji kode sendiri.
Untuk mendapatkan metode yang paling fleksibel, Anda harus menggunakan loop. Ini karena dengan jumlah yang sangat besar orang lain cenderung gagal, sedangkan, ini akan berhasil.
Jadi, loop mana yang digunakan? Nah, itu akan menjadi satu
while
lingkaran. Sebuahfor
loop masih cepat, tetapiwhile
loop hanya sedikit lebih cepat (beberapa ms) - dan bersih.Jawaban seperti itu oleh
Wilco
,Aleksandar Toplek
atauVitim.us
akan melakukan pekerjaan dengan sempurna.Secara pribadi, saya mencoba pendekatan yang berbeda. Saya mencoba menggunakan fungsi rekursif untuk mengisi string / angka. Itu bekerja lebih baik daripada metode bergabung dengan array tetapi, masih, tidak bekerja secepat loop for.
Fungsi saya adalah:
Anda dapat menggunakan fungsi saya dengan, atau tanpa, mengatur variabel padding. Jadi seperti ini:
Secara pribadi, setelah pengujian saya, saya akan menggunakan metode dengan loop sementara, seperti
Aleksandar Toplek
atauVitim.us
. Namun, saya akan memodifikasinya sedikit sehingga Anda dapat mengatur string padding.Jadi, saya akan menggunakan kode ini:
Anda juga dapat menggunakannya sebagai fungsi prototipe, dengan menggunakan kode ini:
sumber
Parameter pertama adalah bilangan real, parameter kedua adalah bilangan bulat positif yang menentukan jumlah minimum digit di sebelah kiri titik desimal dan parameter ketiga adalah bilangan bulat positif opsional yang menentukan angka jika digit di sebelah kanan titik desimal.
begitu
sumber
Jangan menemukan kembali roda, gunakan string garis bawah :
jsFiddle
sumber
Ini adalah solusi ES6.
sumber
const numStr = String(num)
danreturn '0'.repeat(len - numStr.length) + numStr;
Di semua browser modern yang dapat Anda gunakan
Berikut adalah referensi MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
sumber
Bukannya pertanyaan ini membutuhkan lebih banyak jawaban, tetapi saya pikir saya akan menambahkan versi sederhana ini.
_.padLeft(number, 6, '0')
sumber
var zfill = _.partialRight(_.padStart, '0');
npm install --save lodash.padleft
laluimport padLeft from 'lodash.padleft'
hilangkan_.
Cara terbaru untuk melakukan ini jauh lebih sederhana:
output: "02"
sumber
(8).toLocaleString(undefined, {minimumIntegerDigits: 5})
kembali"00.008"
untuk saya, berdasarkan lokal saya.Hanya solusi lain, tapi saya pikir ini lebih mudah dibaca.
sumber
Yang ini kurang asli, tetapi mungkin yang tercepat ...
sumber
pad = count - (num + '').length
. angka negatif tidak ditangani dengan baik, tetapi selain itu, itu tidak buruk. +1Solusi saya
Pemakaian
sumber
Mengapa tidak menggunakan rekursi?
sumber
Beberapa monkeypatching juga berfungsi
sumber
pad(5, 0, 6)
=000005
pad('10', 0, 2)
=10 // don't pad if not necessary
pad('S', 'O', 2)
=SO
... dll.
Bersulang
sumber
var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;
jika Anda memperbaikinya saya akan menghapus suara saya.0
bergabung dengan char :) - Jawaban diperbarui.Solusi paling sederhana dan paling mudah yang akan Anda temukan.
sumber