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?

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'


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


8

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

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


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 "

3

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

f = sprintf '%04d', 49
# f = "0049"

-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

1
Apa sebenarnya if num < 0 && num > -1itu?
Francisco Quintero
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.