Saya sedang mencari JavaScript yang setara dengan printf()
programmer C / PHP atau C # / Java, String.Format()
(IFormatProvider
untuk .NET).
Persyaratan dasar saya adalah seribu format pemisah untuk angka untuk saat ini, tetapi sesuatu yang menangani banyak kombinasi (termasuk tanggal) akan bagus.
Saya menyadari perpustakaan Ajax Microsoft menyediakan versi String.Format()
, tapi kami tidak ingin seluruh overhead kerangka itu.
javascript
printf
string.format
Chris S
sumber
sumber
Jawaban:
Dari ES6 Anda dapat menggunakan string template:
Lihat jawaban Kim di bawah untuk detailnya.
Jika tidak:
Coba sprintf () untuk JavaScript .
Jika Anda benar-benar ingin melakukan metode format sederhana sendiri, jangan lakukan penggantian secara berturut-turut tetapi lakukan secara bersamaan.
Karena sebagian besar proposal lain yang disebutkan gagal ketika string pengganti pengganti sebelumnya juga berisi urutan format seperti ini:
Biasanya Anda akan mengharapkan output
{1}{0}
tetapi output aktual{1}{1}
. Jadi lakukan penggantian secara bersamaan sebagai gantinya dalam saran fearphage .sumber
num.toFixed()
metode mungkin cukup!sprintf() for JavaScript
tidak tersedia.underscore.string
memiliki lebih banyak fitur selain sprintf yang didasarkan padasprintf() for JavaScript
implementasi. Selain itu perpustakaan adalah proyek yang sama sekali berbeda.Membangun solusi yang disarankan sebelumnya:
"{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")
output
Jika Anda memilih untuk tidak memodifikasi
String
prototipe:Memberi Anda lebih akrab:
String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');
dengan hasil yang sama:
sumber
+
-operator), pastikan untuk memasukkan String lengkap dalam tanda kurung:("asd {0}"+"fas {1}").format("first", "second");
Jika tidak, fungsi hanya akan diterapkan ke string terakhir yang ditambahkan.'foo {0}'.format(fnWithNoReturnValue())
. Saat ini akan kembalifoo {0}
. Dengan perubahan Anda, itu akan kembalifoo undefined
.Ini lucu karena Stack Overflow sebenarnya memiliki fungsi format sendiri untuk
String
prototipe yang disebutformatUnicorn
. Cobalah! Pergilah ke konsol dan ketik sesuatu seperti:Anda mendapatkan hasil ini:
Hello, Gabriel, are you feeling OK?
Anda bisa menggunakan objek, array, dan string sebagai argumen! Saya mendapatkan kode dan mengolahnya untuk menghasilkan versi baru
String.prototype.format
:Perhatikan
Array.prototype.slice.call(arguments)
panggilan pintar - itu artinya jika Anda melempar argumen yang berupa string atau angka, bukan objek gaya JSON tunggal, Anda mendapatkanString.Format
perilaku C # yang hampir persis.Itu karena
Array
'sslice
akan memaksa apa pun yang ada diarguments
dalam sebuahArray
, apakah itu awalnya atau tidak, dankey
akan menjadi indeks (0, 1, 2 ...) dari masing-masing elemen array dipaksa string (misalnya, '0', sehingga"\\{0\\}"
untuk pola regexp pertama Anda).Rapi.
sumber
g
), yang dapat mengganti kunci yang sama lebih dari sekali. Dalam contoh di atas, Anda bisa menggunakan{name}
beberapa kali dalam kalimat yang sama dan semuanya diganti.name
itu"blah {adjective} blah"
?Memformat Angka dalam JavaScript
Saya membuka halaman pertanyaan ini dengan harapan menemukan cara memformat angka dalam JavaScript, tanpa memperkenalkan perpustakaan lain. Inilah yang saya temukan:
Membulatkan angka floating-point
Setara dengan
sprintf("%.2f", num)
di JavaScript tampaknyanum.toFixed(2)
, yang memformatnum
ke 2 tempat desimal, dengan pembulatan (tetapi lihat komentar @ ars265 tentang diMath.round
bawah).Bentuk eksponensial
Setara dengan
sprintf("%.2e", num)
isnum.toExponential(2)
.Basis heksadesimal dan lainnya
Untuk mencetak angka di basis B, coba
num.toString(B)
. JavaScript mendukung konversi otomatis ke dan dari basis 2 hingga 36 (selain itu, beberapa browser memiliki dukungan terbatas untuk pengkodean base64 ).Halaman Referensi
Tutorial cepat tentang pemformatan nomor JS
Halaman referensi Mozilla untuk toFixed () (dengan tautan ke toPrecision (), toExponential (), toLocaleString (), ...)
sumber
..
juga berfungsi:33333..toExponential(2);
Dari ES6 Anda dapat menggunakan string template :
Ketahuilah bahwa string templat dikelilingi oleh tanda kutip `bukan tanda kutip (tunggal).
Untuk informasi lebih lanjut:
https://developers.google.com/web/updates/2015/01/ES6-Template-Strings
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings
Catatan: Periksa situs mozilla untuk menemukan daftar browser yang didukung.
sumber
const compile = (x, y) => `I can call this template string whenever I want.. x=${x}, y=${y}`
...compile(30, 20)
jsxt, Zippo
Opsi ini lebih cocok.
Dengan opsi ini saya dapat mengganti string seperti ini:
Dengan kode Anda {0} kedua tidak akan diganti. ;)
sumber
Saya menggunakan fungsi sederhana ini:
Itu sangat mirip dengan string.format:
sumber
+=
?, haruskah ituformatted = this.replace("{" + arg + "}", arguments[arg]);
for...in
tidak akan berfungsi di setiap browser seperti yang diharapkan kode ini. Ini akan mengulang semua properti enumerable, yang di beberapa browser akan sertakanarguments.length
, dan yang lain bahkan tidak akan menyertakan argumen sendiri. Dalam hal apa pun, jikaObject.prototype
ditambahkan ke, penambahan apa pun mungkin akan dimasukkan dalam kelompok. Kode harus menggunakanfor
loop standar , bukanfor...in
."{0} is dead, but {1} is alive!".format("{1}", "ASP.NET") === "ASP.NET is dead, but ASP.NET is alive!"
arg
global. Anda perlu melakukan ini sebagai gantinya:for (var arg in arguments) {
Untuk pengguna Node.js ada
util.format
yang memiliki fungsionalitas seperti printf:sumber
%-20s %5.2f
)Saya terkejut tidak ada yang digunakan
reduce
, ini adalah fungsi JavaScript ringkas dan kuat asli.ES6 (EcmaScript2015)
<ES6
Bagaimana itu bekerja:
sumber
printf
fungsi yang disederhanakan : jsfiddle.net/11szrbx9(...a) => {return a.reduce((p: string, c: any) => p.replace(/%s/, c));
String.prototype.format
di ES6:((a,b,c)=>`${a}, ${b} and ${c}`)(...['me', 'myself', 'I'])
(perhatikan bahwa ini agak berlebihan agar lebih sesuai dengan contoh Anda)printf
penentu tipe dan memasukkan logika untuk awalan padding. Iterasi atas format string dengan cara yang masuk akal tampaknya menjadi tantangan kecil di sini, imho. Solusi yang rapi jika Anda hanya membutuhkan penggantian string.Berikut ini adalah implementasi minimal dari sprintf dalam JavaScript: ia hanya melakukan "% s" dan "% d", tetapi saya telah meninggalkan ruang untuk diperpanjang. Tidak ada gunanya bagi OP, tetapi orang lain yang menemukan thread ini berasal dari Google mungkin mendapat manfaat darinya.
Contoh:
Berbeda dengan solusi serupa di balasan sebelumnya, yang ini melakukan semua penggantian dalam sekali jalan , sehingga tidak akan mengganti bagian dari nilai yang sebelumnya diganti.
sumber
Programmer JavaScript dapat menggunakan String.prototype.sprintf di https://github.com/ildar-shaimordanov/jsxt/blob/master/js/String.js . Di bawah ini adalah contohnya:
sumber
Menambah
zippoxer
jawaban, saya menggunakan fungsi ini:Saya juga memiliki versi non-prototipe yang lebih sering saya gunakan untuk sintaks seperti Java:
Pembaruan ES 2015
Semua hal baru yang keren di ES 2015 membuat ini jauh lebih mudah:
Saya pikir karena ini, seperti yang lebih lama, tidak benar-benar menguraikan huruf, mungkin juga hanya menggunakan token tunggal
%%
. Ini memiliki keuntungan karena jelas dan tidak membuatnya sulit untuk menggunakan tunggal%
. Namun, jika Anda perlu%%
karena suatu alasan, Anda harus menggantinya dengan itu sendiri:sumber
+1 Zippo dengan pengecualian bahwa fungsi tubuh harus seperti di bawah ini atau jika tidak menambahkan string saat ini pada setiap iterasi:
sumber
'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP');
hasilnya menjadiThe ASP is dead. Don't code {0}. Code PHP that is open source!
. Satu hal lagifor(arg in arguments)
tidak berfungsi di IE. saya diganti denganfor (arg = 0; arg <arguments.length; arg++)
for...in
tidak akan berfungsi di setiap browser seperti yang diharapkan kode ini. Ini akan mengulang semua properti enumerable, yang di beberapa browser akan sertakanarguments.length
, dan yang lain bahkan tidak akan menyertakan argumen sendiri. Dalam kasus apa pun, jikaObject.prototype
ditambahkan ke, penambahan apa pun mungkin akan dimasukkan dalam kelompok. Kode harus menggunakanfor
loop standar , bukanfor...in
.Saya ingin berbagi solusi untuk 'masalah'. Saya belum menemukan kembali roda tetapi mencoba mencari solusi berdasarkan apa yang sudah dilakukan JavaScript. Keuntungannya adalah, Anda mendapatkan semua konversi implisit secara gratis. Mengatur properti prototipe $ of String memberikan sintaks yang sangat bagus dan ringkas (lihat contoh di bawah). Ini mungkin bukan cara yang paling efisien, tetapi dalam banyak kasus berurusan dengan output tidak harus super optimal.
Berikut ini beberapa contoh:
sumber
Saya akan menambahkan penemuan saya sendiri yang saya temukan sejak saya bertanya:
Sayangnya sepertinya sprintf tidak menangani ribuan pemisah format seperti format string .NET.
sumber
Saya menggunakan pustaka kecil bernama String.format untuk JavaScript yang mendukung sebagian besar kemampuan format string (termasuk format angka dan tanggal), dan menggunakan sintaks .NET. Script itu sendiri lebih kecil dari 4 kB, sehingga tidak membuat banyak overhead.
sumber
Sangat elegan:
Kredit menjadi
(tautan rusak)https://gist.github.com/0i0/1519811sumber
{{0}}
serta hal-hal seperti{0}{1}.format("{1}", "{0}")
. Harus di bagian paling atas!Jika Anda ingin menangani pemisah ribuan, Anda harus benar-benar menggunakan toLocaleString () dari kelas JavaScript Number karena akan memformat string untuk wilayah pengguna.
Kelas Tanggal JavaScript dapat memformat tanggal dan waktu yang dilokalkan.
sumber
Proyek PHPJS telah menulis implementasi JavaScript untuk banyak fungsi PHP. Karena
sprintf()
fungsi PHP pada dasarnya sama dengan Cprintf()
, implementasi JavaScript-nya harus memenuhi kebutuhan Anda.sumber
Saya menggunakan ini:
Lalu saya menyebutnya:
sumber
Saya punya solusi yang sangat dekat dengan Peter, tetapi berkaitan dengan jumlah dan kasus objek.
Mungkin bisa lebih baik untuk berurusan dengan semua kasus mendalam, tetapi untuk kebutuhan saya ini baik-baik saja.
PS: Fungsi ini sangat keren jika Anda menggunakan terjemahan dalam kerangka template seperti AngularJS :
Di mana en.json adalah sesuatu seperti
sumber
Satu versi yang sedikit berbeda, yang saya sukai (yang ini menggunakan token {xxx} daripada {0} argumen bernomor, ini jauh lebih mendokumentasikan diri sendiri dan lebih cocok untuk pelokalan):
Variasi adalah:
yang memanggil fungsi lokalisasi l () terlebih dahulu.
sumber
Ada "sprintf" untuk JavaScript yang dapat Anda temukan di http://www.webtoolkit.info/javascript-sprintf.html .
sumber
Bagi mereka yang menyukai Node.JS dan
util.format
fitur - fiturnya, saya baru saja mengekstraknya ke dalam bentuk JavaScript vanilla-nya (dengan hanya fungsi yang menggunakan util.format):Dipanen dari: https://github.com/joyent/node/blob/master/lib/util.js
sumber
Untuk pemformatan dasar:
sumber
Saya memiliki pemformat yang sedikit lebih panjang untuk JavaScript di sini ...
Anda dapat melakukan pemformatan beberapa cara:
String.format(input, args0, arg1, ...)
String.format(input, obj)
"literal".format(arg0, arg1, ...)
"literal".format(obj)
Juga, jika Anda telah mengatakan ObjectBase.prototype.format (seperti dengan DateJS ) itu akan menggunakannya.
Contoh ...
Saya juga alias dengan .asFormat dan memiliki beberapa deteksi jika seandainya sudah ada string.format (seperti dengan MS Ajax Toolkit (Saya benci perpustakaan itu).
sumber
Untuk berjaga-jaga jika seseorang membutuhkan fungsi untuk mencegah pencemaran lingkup global, berikut adalah fungsi yang melakukan hal yang sama:
sumber
Kita dapat menggunakan ringan sederhana String.Format tali perpustakaan operasi untuk Naskah yang diketik.
String.Format ():
Format String untuk penentu:
Format String untuk Objek termasuk specifier:
sumber
Saya tidak melihat
String.format
varian:sumber
Untuk digunakan dengan fungsi sukses jQuery.ajax (). Berikan hanya satu argumen dan ganti string dengan properti objek itu sebagai {propertyName}:
Contoh:
sumber