ceros a la izquierda en rieles

152

Tengo campos hry min, ambos enteros en mi aplicación. Para el hrcampo, si el usuario ingresa "1", me gustaría que Rails lo rellene automáticamente a "01" antes de guardarlo en la base de datos. También para el mincampo si el usuario ingresa "0", debe ingresar como "00".

¿Cómo puedo hacer esto?

ed1t
fuente

Respuestas:

336

Sería mejor almacenarlo como un número entero y mostrarlo tal como lo describió en tiempo de ejecución. Cada idioma tiene su propia forma de rellenar ceros: para Ruby puede usar String # rjust . Este método rellena una cadena (justificada a la derecha) para que se convierta en una longitud determinada, utilizando un carácter de relleno dado.

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

Si integeres mayor que la longitud de str, devuelve una nueva Stringlongitud integercon la strderecha justificada y rellenada con padstr; de lo contrario, vuelve 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
fuente
20

Esto también es bastante útil:

"%.2d" % integer

La cadena resultante será de 2 caracteres y si el número es inferior a 2 caracteres, entonces habrá 0 en la cadena.

Sumit Bisht
fuente
8

No se puede almacenar 01como entero. Se convertirá a1

Puede almacenarlo como una cadena, o puede mostrarlo como una cadena "01"

fl00r
fuente
44
Almacenarlo como un entero y mostrarlo como una cadena (rellenado con 0) sería mi recomendación. Java StringUtils de Apache tenía un buen método de almohadilla como ese. Encontré este hilo en el relleno: ruby-forum.com/topic/82137
McStretch
6

Me gusta el operador%, a pesar de que parece haber perdido popularidad ...

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
fuente
3

Otra forma de lograr esto es rellenar su número entero en tiempo de visualización, usando sprintf:

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

Prueba esto y puedes cambiarlos para que coincidan

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
fuente
1
¿Qué if num < 0 && num > -1es exactamente ?
Francisco Quintero