memimpin nol di rel

152

Saya memiliki bidang hrdan min, keduanya bilangan bulat dalam aplikasi saya. Untuk hrbidang, jika pengguna memasukkan "1" Saya ingin Rails secara otomatis pad ke "01" sebelum menyimpannya ke database. Juga untuk minbidang jika pengguna memasukkan "0" itu harus dimasukkan sebagai "00".

Bagaimana saya bisa melakukan ini?

ed1t
sumber

Jawaban:

336

Akan lebih baik untuk menyimpannya sebagai integer dan hanya menampilkannya seperti yang Anda jelaskan saat runtime. Setiap bahasa memiliki caranya sendiri untuk membuat angka nol - untuk Ruby Anda dapat menggunakan String # rjust . Metode ini membalut string (dibenarkan-kanan) sehingga menjadi panjang tertentu, menggunakan karakter padding yang diberikan.

str.rjust(integer, padstr=' ') → new_str

Jika integerlebih besar dari panjang str, mengembalikan baru Stringpanjang integerdengan strdibenarkan kanan dan empuk dengan padstr; jika tidak, kembali str.

some_int = 5
some_int.to_s.rjust(2, '0')  # => '05'
some_int.to_s.rjust(5, '0')  # => '00005'

another_int = 150
another_int.to_s.rjust(2, '0') # => '150'
another_int.to_s.rjust(3, '0') # => '150'
another_int.to_s.rjust(5, '0') # => '00150'
Jon Gauthier
sumber
60

Anda bisa mengubah bilangan bulat menjadi string semacam itu dengan:

result_string = '%02i' % your_integer

Ini tidak tergantung dari bagaimana ia disimpan di db.

J -_- L
sumber
20

Ini juga cukup berguna:

"%.2d" % integer

String yang dihasilkan akan terdiri dari 2 karakter dan jika jumlahnya kurang dari 2 karakter, maka 0s akan ada dalam string

Sumit Bisht
sumber
8

Anda tidak dapat menyimpan 01sebagai integer. Ini akan dikonversi menjadi1

Anda dapat menyimpannya sebagai string, atau Anda dapat menampilkannya sebagai string "01"

fl00r
sumber
4
Menyimpannya sebagai bilangan bulat dan menunjukkannya sebagai string (diisi dengan 0) akan menjadi rekomendasi saya. Apache StringUtils Apache memiliki metode pad yang bagus seperti itu. Menemukan utas ini di padding: ruby-forum.com/topic/82137
McStretch
6

Saya suka operator%, meskipun tampaknya tidak disukai ...

2.0.0-p247 :001 > '%02i' % 1
 => "01"
2.0.0-p247 :002 > '%2i' % 1
 => " 1"
2.0.0-p247 :003 > '%-2i' % 1
 => "1 "
nroose
sumber
3

Cara lain untuk mencapai ini adalah melapisi bilangan bulat Anda pada waktu tampilan, menggunakan sprintf:

f = sprintf '%04d', 49
# f = "0049"
SylvainB
sumber
-5

Coba ini dan Anda dapat mengubahnya agar sesuai

def numeric92(num)
  if num.present?
    if num < 0 && num > -1
      ('-%05d' % num) + '.' + ('%.2f' % num).split('.').last
    else
      ('%06d' % num) + '.' + ('%.2f' % num).split('.').last
    end
  else
    '000000.00'
  end
end
Ksaynice
sumber
1
Apa sebenarnya if num < 0 && num > -1itu?
Francisco Quintero