Saya mengeluarkan serangkaian file bernomor dari skrip Ruby. Angka-angka tersebut berasal dari penambahan penghitung, tetapi untuk membuatnya tersortir dengan baik di direktori, saya ingin menggunakan angka nol di depan nama file. Dengan kata lain
file_001 ...
dari pada
file_1
Apakah ada cara sederhana untuk menambahkan angka nol di depan saat mengonversi angka menjadi sebuah string? (Saya tahu saya bisa melakukan "jika kurang dari 10 ... jika kurang dari 100").
%
berfungsi tetapi merupakan tujuan yang lebih umum.Gunakan
%
operator dengan string:Sisi kiri adalah string format printf, dan sisi kanan dapat berupa daftar nilai, sehingga Anda bisa melakukan sesuatu seperti:
Berikut lembar contekan format printf yang mungkin berguna untuk membentuk string format Anda. Format printf berasal dari
C
fungsiprintf
, tetapi fungsi format serupa tersedia dalam perl, ruby, python, java, php, dll.sumber
Kernel#sprintf
, yang didokumentasikan di sini: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintfsprintf("%03d", 5)
.Tidak bisakah Anda hanya menggunakan pemformatan string dari nilai sebelum Anda menggabungkan nama file?
sumber
Gunakan
String#next
sebagai penghitung.next
relatif 'pintar', yang berarti Anda bahkan bisa melakukannyasumber
Seperti yang dinyatakan oleh jawaban lain,
"%03d" % number
bekerja cukup baik, tetapi itu bertentangan dengan panduan gaya rubocop ruby :Kami dapat memperoleh hasil yang sama dengan cara yang lebih mudah dibaca menggunakan yang berikut:
sumber
format
. Jika tujuan Anda adalah membuat kode Anda mudah dimengerti, Anda harus menggunakannyasprintf
, karena itu adalah bagian dari C-library standar. Nama ini digunakan di seluruh bahasa pemrograman. Cara lebih banyak orang mengerti apa yangsprintf
dilakukan, dibandingkan dengan jumlah yang tahu ituformat
adalah alias untuk itu. Hanya karena sesuatu adalah bagian dari RuboCop tidak menjadikannya benar atau salah. Pilih aturan yang paling masuk akal untuk proyek Anda.'%03d' % number
bahkan lebih mudah dibaca."%02d" % num
menjadisprintf(...)
, laluformat(...)
sesuai saran RuboCop. Saya kemudian memutuskan bahwasprintf
itu lebih konvensional daripadaformat
, jadi diperbarui dengan rubocop.ymlStyle/FormatString: EnforcedStyle: sprintf
dan sekarang saya tidur nyenyak di malam hari.filenames = '000'.upto('100').map { |index| "file_#{index}" }
Keluaran
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]
sumber