Stripping Kommas aus ganzen zahlen oder Dezimalzahlen, die in Schienen
Gibt es eine gsub-äquivalent für ganze zahlen oder Dezimalzahlen? Sollte gsub Arbeit mit Ganzzahlen? Im Grunde versuche ich nur geben Sie dezimal-in eine ruby-form und was die Benutzer werden in der Lage, verwenden Sie Kommas. Zum Beispiel möchte ich den Benutzer eingeben zu können, wird die 1.000.99.
Ich habe versucht, mit
before_save :strip_commas
def strip_commas
self.number = self.number.gsub(",", "")
end
bekomme aber immer die folgende Fehlermeldung "undefined method `gsub' für 8:Fixnum", wo die "8" wird ersetzt mit dem, was Anzahl der Benutzer.
- ist das Anzahl-Feld eine float? Schienen sollten kümmern sich um die Konvertierung für Sie, damit das Komma nicht wirklich, es gibt in den Daten.
- Das Feld dezimal. Wenn ich ungefähr 2.000, in das Feld, bekomme ich "2" in meiner mysql-Datenbank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr Feld ist ein Fixnum, es wird nie Kommas, wie Schienen, wandeln die Benutzer-Eingabe in eine Zahl um, um es zu speichern gibt.
Aber es wird, dass durch den Aufruf to_i auf der input-string, das ist nicht, was Sie wollen.
überschreiben der normalen setter etwas wie
Nicht getestet, aber so etwas wie dies funktionieren sollte...
Die Sie brauchen, um auf die Kommas, während der Eingang ist immer noch ein string.
Edit:
Wie bereits in den Kommentaren, wenn Sie möchten, zu akzeptieren, Dezimalzahlen, und erstellen Sie etwas, was keine ganze Zahl, müssen Sie eine andere Umwandlung als
String.to_i
. Auch verschiedene Länder haben unterschiedliche Konventionen für numerische Satzzeichen, so ist dies nicht eine komplette Lösung.self[:price] = num.to_f
ist der richtige Weg. Ich habe versuchtself.price = num.to_f
es wirftSystemStackError (stack level too deep)
versuchen
self.number.gsub(/\D/, '')
. Das ist, entfernen alles, was nicht eine Zahl. Regexen machen keine Unterscheidung zwischen Integer, floats, Dezimalzahlen, etc. Es ist alles strings. Und Schienen nicht konvertieren, es richtig für Sie, denn es ruft einfach nur#to_i
oder#to_f
drauf.EDIT:
tatsächlich:
self.number.gsub(/[^\d\.]/, '').to_f
: alles, was nicht Ziffer oder dem Dezimalpunkt, und konvertieren Sie es in einen float.'.'
weil, wenn es in einem Bereich'[.]'
wird, verliert es seine Besonderheit und wird automatisch ein literal. So[^\d.]
ist korrekt. Verlassen Sie entkommen ist OK, aber da es fungiert als eine visuelle Erinnerung an das Verhalten.