Décapage des virgules à partir de nombres Entiers ou des nombres décimaux par des rails
Est-il un gsub équivalent pour les entiers ou les décimales? Devrait gsub travailler avec des entiers? Fondamentalement, je suis juste en train de décimales dans un rubis de forme et de ce que l'utilisateur d'être en mesure d'utiliser des virgules. Par exemple, je veux que l'utilisateur puisse entrer de 1 000.99.
J'ai essayé d'utiliser
before_save :strip_commas
def strip_commas
self.number = self.number.gsub(",", "")
end
mais l'erreur suivante s'affiche "undefined method `gsub " pour 8:Fixnum" où "8" est remplacé par le contenu du numéro de l'utilisateur.
est le nombre de champ d'un flotteur? Les Rails doivent prendre soin de la conversion pour vous, ainsi que la virgule ne sera pas vraiment être là dans les données.
Le champ est décimal. Quand je rentre quelque chose comme de 2 000 dans le domaine, j'obtiens un "2" dans ma base de données mysql.
Le champ est décimal. Quand je rentre quelque chose comme de 2 000 dans le domaine, j'obtiens un "2" dans ma base de données mysql.
OriginalL'auteur Oakland510 | 2011-06-30
Vous devez vous connecter pour publier un commentaire.
Si votre champ est un Fixnum, il n'aura jamais des virgules, comme les Rails de convertir la saisie de l'utilisateur dans un certain nombre afin de les stocker.
Cependant, cela ne sera que par l'appel de to_i sur la chaîne d'entrée, ce qui n'est pas ce que vous voulez.
substitution de la normale setter pour quelque chose comme
Pas testé, mais quelque chose ressemblant à ceci devrait fonctionner...
Vous avez besoin pour obtenir à la virgule alors que l'entrée est toujours une chaîne de caractères.
Edit:
Comme indiqué dans les commentaires, si vous souhaitez accepter les décimales, et de créer quelque chose de pas un nombre entier, vous avez besoin d'un autre type de conversion que
String.to_i
. Aussi, les différents pays ont différentes conventions pour les signes de ponctuation, donc ce n'est pas une solution complète.En effet, j'ai oublié de vous voulait aussi permettre décimales et nous avons affaire à des Fixnum et pas en Entier... Mais vous avez l'idée. Je vais modifier la réponse.
Sachez que cela peut vous attraper quelque part en bas de la ligne, depuis que les Européens vont taper des choses comme 100,00, sens de 100,00$, qui vous allez interpréter comme 10000. Je parle d'expérience.
Heureusement, les utilisateurs seront tous US. Au moins pour cette application. Dans l'avenir, bien que, est-il une meilleure façon de le faire c'est plus de la région agnostique?
super réponse!
self[:price] = num.to_f
est correct. J'ai essayéself.price = num.to_f
il soulèveSystemStackError (stack level too deep)
OriginalL'auteur Don Roby
essayer
self.number.gsub(/\D/, '')
. C'est, supprimer tout ce qui n'est pas un chiffre. Regexen ne pas faire de distinction entre les nombres entiers, les décimaux, les décimales, etc. C'est toutes les chaînes. Et les Rails à ne pas convertir correctement pour vous, parce qu'il vient d'appels#to_i
ou#to_f
.EDIT:
en fait:
self.number.gsub(/[^\d\.]/, '').to_f
: tout ce qui n'est pas un chiffre ou un point décimal, et de le convertir à un flotteur.'.'
parce que, lorsqu'il est dans une gamme'[.]'
, elle perd son caractère spécifique et est automatiquement un littéral. Donc[^\d.]
est plus correct. Laissant échappé est OK, bien, parce qu'il agit comme un rappel visuel du comportement.OriginalL'auteur Ian