2013-07-15 2 views
9

Come posso convertire l'immissione del numero utente da qualcosa come 11,5 a 11,5?Converti virgola in punto come delimitatore

Ho provato quanto segue come callback:

before_validation :comma_to_delimiter 

def comma_to_delimiter 
    self.price.to_s.gsub(',', '.').to_f 
end 

Ma questo non funziona. Voglio che l'utente sia in grado di digitare qualsiasi cosa desideri come delimitatore - al momento, l'app genera un errore quando l'utente utilizza una virgola anziché un punto.

+0

Puoi spiegare che tipo di valore è self.price? – Slicedpan

+0

Si desidera modificare questo per la visualizzazione in app rotaie, giusto? –

+0

No, non mi interessa come viene visualizzato. Ne ho parlato attraverso i locali. Il prezzo è un valore float che deve essere memorizzato come float con punto come delimitatore. Il problema è che in Germania le persone digitano virgole anziché punti come delimitatori. Quindi, anche se una persona tedesca digita "5,5", dovrebbe comunque essere memorizzata come "5.5". E se qualcuno lo inserisce correttamente, ad esempio "5.5", non è necessario modificare nulla. Qualche idea su come fare questo? – weltschmerz

risposta

9

Quello che stai facendo potrebbe non essere il modo migliore, quindi forse qualcuno può rispondere con un approccio migliore. Ma per far funzionare la tua linea devi renderla effettivamente persistente.

self.price.to_s.gsub(',', '.').to_f 

Restituirà solo la modifica, ma che non va da nessuna parte in una richiamata!

self.price = self.price.to_s.gsub(',', '.').to_f 
# OR 
self.price.to_s.gsub!(',', '.').to_f 

Persisterà la modifica all'interno dell'oggetto.

+0

La seconda versione non cambierà il valore di self.price – Slicedpan

+0

Ho eseguito il codice localmente e sicuramente lo fa, l'hai provato? Testato e funziona esattamente come descritto in Rails 3. – Matt

+0

Sì, appena realizzato, se self.price è già una stringa, quindi cambierà. Stavo partendo dal presupposto che fosse un numero in virgola mobile (potrebbe aver frainteso la domanda!) – Slicedpan

11

In alcuni paesi la virgola è il delimitatore di valuta standard e se un utente digita "19,99" in un modulo verrà salvato come "19.00" a meno che non si gestisca manualmente la conversione del delimitatore. Penso che il modo giusto per risolvere questo problema sia scrivere setter di attributi personalizzati.

class Product < ActiveRecord::Base 
    def price=(val) 
    val.sub!(',', '.') if val.is_a?(String) 
    self['price'] = val 
    end 
end 
+2

Sarebbe bello gestirlo globalmente per tutti gli attributi float. – Vassilis