web-dev-qa-db-fra.com

zéros non significatifs dans rails

J'ai des champs hr et min, les deux entiers de mon application. Pour le champ hr, si l'utilisateur entre "1", j'aimerais que Rails le compresse automatiquement sur "01" avant de l'enregistrer dans la base de données. Aussi pour le min champ si l'utilisateur entre "0", il doit entrer "00".

Comment puis-je faire ceci?

141
ed1t

Il serait préférable de le stocker en tant qu'entier et de simplement l'afficher comme vous l'avez décrit au moment de l'exécution. Chaque langue a sa propre manière de compléter les zéros - pour Ruby vous pouvez utiliser String # rjust . Cette méthode remplit une chaîne (justifiée à droite) de sorte qu'elle devienne un longueur donnée, en utilisant un caractère de remplissage donné.

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

Si integer est supérieur à la longueur de str, retourne un nouveau String de longueur integer avec str justifié à droite et complété avec padstr; sinon, retourne 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'
319
Jon Gauthier

Vous pouvez transformer l'entier en une chaîne de ce type avec:

result_string = '%02i' % your_integer

Ceci est indépendant de la façon dont il est enregistré dans la base de données.

58
J-_-L

C'est aussi très pratique:

"%.2d" % integer

La chaîne résultante sera de 2 caractères et si le nombre est inférieur à 2 caractères, 0 sera présent dans la chaîne

18
Sumit Bisht

Vous ne pouvez pas stocker 01 en entier. Il sera converti en 1

Vous pouvez le stocker en tant que chaîne, ou vous pouvez l'afficher en tant que chaîne "01"

8
fl00r

J'aime l'opérateur%, même s'il semble être tombé en disgrâce ...

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

Une autre méthode consiste à remplir votre entier au moment de l'affichage en utilisant sprintf:

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