zéros en tête dans les rails

152

J'ai des champs hret min, les deux entiers dans mon application. Pour le hrchamp, si l'utilisateur entre "1", je voudrais que Rails le remplisse automatiquement à "01" avant de l'enregistrer dans la base de données. Aussi pour le minchamp si l'utilisateur saisit "0", il doit le mettre en tant que "00".

Comment puis-je faire ceci?

ed1t
la source

Réponses:

336

Il serait préférable de le stocker sous forme d'entier et de l'afficher comme vous l'avez décrit lors de l'exécution. Chaque langue a sa propre façon de remplir des zéros - pour Ruby, vous pouvez utiliser String # rjust . Cette méthode remplit une chaîne (justifiée à droite) pour qu'elle devienne une longueur donnée, en utilisant un caractère de remplissage donné.

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

Si integerest supérieur à la longueur de str, renvoie un nouveau Stringde longueur integeravec strjustifié à 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'
Jon Gauthier
la source
60

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.

J -_- L
la source
20

C'est également très pratique:

"%.2d" % integer

La chaîne résultante sera de 2 caractères et si le nombre est de moins de 2 caractères, alors des 0 seront présents dans la chaîne

Sumit Bisht
la source
8

Vous ne pouvez pas stocker 01sous forme d'entier. Il sera converti en1

Vous pouvez le stocker sous forme de chaîne ou vous pouvez l'afficher sous forme de chaîne "01"

fl00r
la source
4
Le stocker en tant qu'entier et le montrer sous forme de chaîne (complété par des 0) serait ma recommandation. Java StringUtils d'Apache avait une bonne méthode de pad comme ça. J'ai
McStretch
6

J'aime l'opérateur%, même s'il semble avoir perdu la faveur ...

2.0.0-p247 :001 > '%02i' % 1
 => "01"
2.0.0-p247 :002 > '%2i' % 1
 => " 1"
2.0.0-p247 :003 > '%-2i' % 1
 => "1 "
nez
la source
3

Une autre façon d'y parvenir est de remplir votre entier au moment de l'affichage, en utilisant sprintf:

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

Essayez ceci et vous pouvez les modifier pour qu'ils correspondent

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
la source
1
Qu'est-ce que if num < 0 && num > -1c'est exactement ?
Francisco Quintero