zeros à esquerda nos trilhos

152

Eu tenho campos hre min, ambos os números inteiros no meu aplicativo. Para o hrcampo, se o usuário digitar "1", gostaria que o Rails preenchesse automaticamente "01" antes de salvá-lo no banco de dados. Também para o mincampo, se o usuário digitar "0", ele deverá ser inserido como "00".

Como posso fazer isso?

ed1t
fonte

Respostas:

336

Seria melhor armazená-lo como um número inteiro e apenas exibi-lo como você descreveu em tempo de execução. Todo idioma tem sua própria maneira de preencher zeros - para Ruby você pode usar a String # rjust . Esse método preenche uma string (justificada à direita) para que ela se torne um determinado comprimento, usando um caractere de preenchimento especificado.

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

Se integerfor maior que o comprimento de str, retorna um novo Stringcomprimento integercom strjustificado à direita e preenchido com padstr; caso contrário, retorna 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
fonte
60

Você pode transformar o número inteiro em uma sequência desse tipo com:

result_string = '%02i' % your_integer

Isso é independente de como é salvo no banco de dados.

J -_- L
fonte
20

Isso também é bastante útil:

"%.2d" % integer

A sequência resultante terá 2 caracteres e, se o número for menor que 2, os 0s estarão presentes na sequência.

Sumit Bisht
fonte
8

Você não pode armazenar 01como número inteiro. Será convertido para1

Você pode armazená-lo como uma sequência ou pode ser exibido como uma sequência "01"

fl00r
fonte
4
Armazená-lo como um número inteiro e mostrá-lo como uma string (preenchida com zeros) seria minha recomendação. O Java StringUtils do Apache tinha um bom método de pad como esse. Encontrado esta discussão sobre padding: ruby-forum.com/topic/82137
McStretch
6

Gosto do operador%, mesmo que pareça ter saído em desuso ...

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

Outra maneira de conseguir isso é preencher o número inteiro no tempo de exibição, usando o sprintf:

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

Tente isso e você pode alterá-los para combinar

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
fonte
1
O que exatamente if num < 0 && num > -1é?
Francisco Quintero