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?

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'


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


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"


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 "

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"

-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

1
Qu'est-ce que if num < 0 && num > -1c'est exactement ?
Francisco Quintero
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.