Saya membutuhkan fungsi JavaScript yang dapat mengambil nilai dan membatasinya sampai batas tertentu (saya perlu spasi, tapi apa pun bisa dilakukan). Aku menemukan ini:
Kode:
String.prototype.pad = function(l, s, t){
return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
+ 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
+ this + s.substr(0, l - t) : this;
};
Contoh:
<script type="text/javascript">
//<![CDATA[
var s = "Jonas";
document.write(
'<h2>S = '.bold(), s, "</h2>",
'S.pad(20, "[]", 0) = '.bold(), s.pad(20, "[]", 0), "<br />",
'S.pad(20, "[====]", 1) = '.bold(), s.pad(20, "[====]", 1), "<br />",
'S.pad(20, "~", 2) = '.bold(), s.pad(20, "~", 2)
);
//]]>
</script>
Tapi saya tidak tahu apa yang sedang dilakukan dan sepertinya tidak berhasil untuk saya.
javascript
string
Anthony Potts
sumber
sumber
Jawaban:
Saya menemukan solusi ini di sini dan ini bagi saya jauh lebih sederhana:
Dan di sini saya membuat ekstensi ke objek string:
Contoh untuk menggunakannya:
Ini akan mengembalikan waktu dalam format "15:30"
sumber
String
lib JSString.padStart()
danString.padEnd()
untuk padding kiri / kanan.Metode yang lebih cepat
Jika Anda melakukan ini berulang kali, misalnya untuk menambahkan nilai dalam array, dan kinerja adalah faktor, pendekatan berikut ini dapat memberi Anda hampir 100x keunggulan dalam kecepatan ( jsPerf ) dibandingkan solusi lain yang saat ini dibahas di web antar. Ide dasarnya adalah bahwa Anda menyediakan fungsi pad dengan string kosong penuh untuk digunakan sebagai buffer. Fungsi pad hanya menambahkan string yang akan ditambahkan ke string pra-empuk ini (satu string concat) dan kemudian mengiris atau memangkas hasilnya dengan panjang yang diinginkan.
Misalnya, untuk nol pad nomor dengan panjang 10 digit,
Untuk mengisi string dengan spasi, sehingga seluruh string adalah 255 karakter,
Uji kinerja
Lihat tes jsPerf di sini .
Dan ini lebih cepat dari ES6
string.repeat
2x juga, seperti yang ditunjukkan oleh JsPerf yang direvisi di sinisumber
string.repeat
metode ES6 . Jadi jika Anda melakukan banyak padding string, pasti coba ini.http://www.webtoolkit.info/javascript_pad.html
Ini jauh lebih mudah dibaca.
sumber
pad("hello", 20) = "hello "
Inilah pendekatan rekursif untuk itu.
Sebuah contoh...
sumber
String.prototype.padStart()
danString.prototype.padEnd()
saat ini adalah proposal kandidat TC39: lihat github.com/tc39/proposal-string-pad-start-end (hanya tersedia di Firefox pada April 2016; polyfill tersedia).sumber
myString.padStart(padLength [, padString])
danmyString.padEnd(padLength [, padString])
ECMAScript 2017 menambahkan metode padStart ke prototipe String. Metode ini akan mengisi string dengan spasi hingga panjang tertentu. Metode ini juga mengambil string opsional yang akan digunakan alih-alih ruang untuk pengisi.
Metode padEnd juga ditambahkan yang bekerja dengan cara yang sama.
Untuk kompatibilitas browser (dan polyfill yang berguna) lihat tautan ini .
sumber
Menggunakan metode ECMAScript 6 metode String # repeat , fungsi pad semudah:
String#repeat
saat ini hanya didukung di Firefox dan Chrome. untuk implementasi lain, seseorang dapat mempertimbangkan polyfill sederhana berikut:sumber
Menggunakan metode ECMAScript 6 fungsi String # repeat dan Arrow , fungsi pad sesederhana:
jsfiddle
sunting: saran dari komentar:
dengan cara ini, ia tidak akan melempar kesalahan ketika
s.length
lebih besar darin
sunting2: saran dari komentar:
dengan cara ini, Anda dapat menggunakan fungsi untuk string dan non-string.
sumber
s.length
lebih besar darin
itu akan dibuang. Sarankan:let leftPad = (s, c, n) => n - s.length > 0 ? c.repeat(n - s.length) + s : s;
leftPad(12, ' ', 5)
. Meskipun saya tahu benar-benar berbicara bahwa mungkin ok itu mungkin salah satu kasus penggunaan paling umum (nomor padding). Mungkinfunction leftPad(s, c, n) { s = s.toString(); return s.length > len ? s : c.repeat(n - s.length) + s; }
. Menggunakanfunction
berarti leftPad dapat di bagian bawah file. Kalau tidak, Anda bisa menggunakanconst
tidakvar
atau tidaklet
.len
?len
seharusnyan
Trik kunci dalam kedua solusi tersebut adalah membuat
array
instance dengan ukuran yang diberikan (satu lebih dari panjang yang diinginkan), dan kemudian segera memanggiljoin()
metode untuk membuat astring
. Thejoin()
Metode dilewatkan paddingstring
(spasi mungkin). Karenaarray
kosong, sel-sel kosong akan dirender sebagai kosongstrings
selama proses bergabungarray
menjadi satu hasilstring
, dan hanya bantalan yang akan tetap. Ini teknik yang sangat bagus.sumber
pad dengan nilai default
Saya perhatikan bahwa saya sebagian besar memerlukan padLeft untuk konversi waktu / nomor padding
jadi saya menulis fungsi ini
Fungsi sederhana ini mendukung Angka atau String sebagai input
pad default adalah 2 karakter
karakter default adalah 0
jadi saya bisa menulis
jika saya menambahkan argumen kedua (lebar pad)
parameter ketiga (pad char)
EDIT @BananaAcid jika Anda memberikan nilai yang tidak ditentukan atau string 0 panjang yang Anda dapatkan
0undefined
..so:seperti yang disarankan
tetapi ini juga bisa dicapai dengan cara yang lebih singkat.
bekerja juga dengan:
Dan jika Anda ingin dapat menggunakan keduanya:
yang dapat ditulis dengan cara yang lebih singkat tanpa menggunakan slice.
sekarang jika Anda mencoba untuk pad 'averylongword' dengan 2 ... itu bukan masalah saya.
Mengatakan bahwa saya memberi Anda tip.
Sebagian besar waktu jika Anda pad Anda melakukannya untuk nilai yang sama N kali.
Menggunakan semua jenis fungsi di dalam sebuah loop memperlambat loop !!!
Jadi jika Anda hanya ingin memasukkan beberapa angka di dalam daftar yang panjang jangan gunakan fungsi untuk melakukan hal sederhana ini.
gunakan sesuatu seperti ini:
jika Anda tidak tahu bagaimana ukuran bantalan maksimum berdasarkan angka-angka di dalam array.
sumber
return (new Array((b||1)+1).join(c||0)+(a||'')).slice(-(b||2))
. Dan seperti biasa: kalian di luar sana, jangan hanya menyalin kode yang tidak Anda mengerti.Dengan ES8, ada dua opsi untuk bantalan.
Anda dapat memeriksanya di dokumentasi.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
sumber
Mengambil ide-ide Samuel, naik ke sini. Dan ingat skrip SQL lama, saya coba dengan ini:
Ini berfungsi dalam semua kasus yang dapat saya bayangkan:
sumber
string padding telah diterapkan dalam versi javascript baru.
str.padStart(targetLength [, padString])
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/padStart
Jika Anda ingin fungsi Anda sendiri, periksa contoh ini:
sumber
Inilah fungsi sederhana yang saya gunakan.
Sebagai contoh:
sumber
Cara singkat:
Contoh:
kembali: "001234"
sumber
String.prototype.padStart()
seharusnya lebih mudah.es7 hanyalah draft dan proposal saat ini, tetapi jika Anda ingin melacak kompatibilitas dengan spec, fungsi pad Anda perlu:
Dari perpustakaan polyfill saya, tetapi terapkan uji tuntas Anda sendiri untuk ekstensi prototipe.
sumber
Inilah jawaban sederhana pada dasarnya satu baris kode.
Pastikan jumlah karakter dalam padding Anda, nol di sini, setidaknya sebanyak panjang minimum yang Anda inginkan. Jadi sungguh, untuk membuatnya menjadi satu baris, untuk mendapatkan hasil "00035" dalam kasus ini adalah:
sumber
Manipulasi array sangat lambat dibandingkan dengan string concat sederhana. Tentu saja, patokan untuk kasus penggunaan Anda.
sumber
Varian dari jawaban @Daniel LaFavers .
Sebagai contoh:
sumber
Ini tahun 2014, dan saya menyarankan fungsi string-padding Javascript. Ha!
Bare-tulang: bantalan kanan dengan spasi
Fancy: pad dengan opsi
Penggunaan (mewah):
sumber
Jika Anda tidak keberatan menyertakan perpustakaan utilitas, perpustakaan lodash memiliki fungsi _.pad, _.padLeft dan _.padRight .
sumber
Saya pikir lebih baik menghindari rekursi karena mahal.
sumber
Ini adalah fungsi JavaScript yang menambahkan jumlah bantalan tertentu dengan symble khusus. fungsi ini mengambil tiga parameter.
sumber
Dan kemudian Anda dapat melakukan:
sumber
Jika Anda hanya ingin pad satu-liner yang sangat simpel untuk pad, buat saja string karakter padding yang diinginkan dari panjang max padding yang diinginkan dan kemudian substring ke panjang apa yang ingin Anda pad.
Contoh: mengisi string store
e
dengan spasi hingga 25 karakter.Hasil:
"hello "
Jika Anda ingin melakukan hal yang sama dengan nomor sebagai input panggil
.toString()
saja sebelumnya.sumber
Array(n).join(c)
untuk membuat panjang padding dan karakter padding dapat dikonfigurasi, misalnyaArray(26).join(' ')
.namun lain mengambil kombinasi dari beberapa solusi
sumber
Seorang teman bertanya tentang menggunakan fungsi JavaScript untuk menulis di sebelah kiri. Itu berubah menjadi sedikit usaha antara kami dalam obrolan untuk kode golf itu. Ini hasilnya:
Ini memastikan bahwa nilai yang akan empuk adalah string, dan kemudian jika bukan panjang total panjang yang diinginkan itu akan pad itu sekali dan kemudian muncul kembali. Berikut ini tampilannya dengan penamaan dan struktur yang lebih logis
Contoh yang kami gunakan adalah untuk memastikan bahwa angka-angka diisi dengan
0
ke kiri untuk membuat panjang maksimal 6. Berikut adalah contoh yang ditetapkan:sumber
Sedikit terlambat, tetapi tetap berpikir saya mungkin akan berbagi. Saya merasa berguna untuk menambahkan ekstensi prototipe ke Object. Dengan begitu saya bisa memasukkan angka dan string, kiri atau kanan. Saya memiliki modul dengan utilitas serupa yang saya sertakan dalam skrip saya.
~~~~~~~~~~~~ jsAddOns.js ~~~~~~~~~~~~
sumber
str = pad + str;
), karena data akan dialokasikan kembali setiap kali. Tambahkan selalu di akhir!str += pad;
). Jauh lebih cepat untuk menambahkan string padding ke dirinya sendiri dan mengekstrak x-chars pertama (parser dapat melakukan ini secara efisien jika Anda mengekstrak dari char pertama). Ini adalah pertumbuhan eksponensial, yang berarti ia membuang beberapa memori untuk sementara waktu (Anda tidak harus melakukan ini dengan teks yang sangat besar).sumber
Inilah pendapat saya
Saya tidak begitu yakin tentang kinerjanya, tapi saya merasa itu lebih mudah dibaca daripada opsi lain yang saya lihat di sini ...
sumber