È necessario pulire l'input in modo che gli utenti possano digitare praticamente ciò che vogliono e otterrete qualcosa di coerente da memorizzare nel database. Supponendo che il tuo modello si chiami "DoughEntry" e il tuo attributo sia "amount", esso viene memorizzato come numero intero.
Ecco un metodo che converte una stringa in input in centesimi (se la stringa termina in due cifre seguendo un delimitatore, si presume che sia un centesimo). Si potrebbe desiderare di rendere questo più intelligente, ma ecco il concetto:
def convert_to_cents(input)
if input =~ /^.*[\.,]\d{2}$/
input.gsub(/[^\d-]/,'').to_i
else
"#{input.gsub(/[^\d-]/,'')}00".to_i
end
end
>> convert_to_cents "12,345"
=> 1234500
>> convert_to_cents "12.345,67"
=> 1234567
>> convert_to_cents "$12.345,67"
=> 1234567
Poi sovrascrivere la funzione di accesso di default "quantità", passando attraverso quel metodo:
class DoughEntry << ActiveRecord::Base
def amount=(input)
write_attribute(:amount, convert_to_cents(input))
end
protected
def convert_to_cents(input)
if input =~ /^.*[\.,]\d{2}$/
input.gsub(/[^\d-]/,'').to_i
else
"#{input.gsub(/[^\d-]/,'')}00".to_i
end
end
end
Ora stai memorizzazione centesimi nel Banca dati. Radar ha l'idea giusta per tirarlo fuori.
Immetti spesso il segno, per separare i punteggi quando digiti un numero ?? Io personalmente mai. –
Io no, ma non posso garantire che nessuno lo farà. Preferirei sbagliare dalla parte della felicità dell'utente piuttosto che della frustrazione. Inoltre, se stai copiando dei valori, ad esempio, sul tuo estratto conto online, potrebbe essere già formattato con $ e, e. e ogni sorta di altri personaggi. –