Musisz wyczyścić dane wejściowe, aby użytkownicy mogli wpisać dokładnie to, co chcą, a otrzymasz coś spójnego do przechowywania w bazie danych. Zakładając, że twój model nazywa się "DoughEntry", a twoim atrybutem jest "kwota", i jest przechowywany jako liczba całkowita.
Oto metoda, która konwertuje dane wejściowe ciągu na centy (jeśli ciąg kończy się dwiema cyframi po ograniczniku, przyjmuje się, że jest to cent). Może chcesz, aby ten mądrzejszy, ale tutaj jest pojęcie:
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
Następnie nadpisać domyślny „ilość” akcesor, przepuszczając ją przez tą metodą:
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
Teraz jesteś przechowywanie centów w Baza danych. Radar ma dobry pomysł na wycofanie go.
Czy często wpisujesz, aby oddzielić wyniki, gdy wpiszesz cyfrę? Osobiście nigdy. –
Nie, ale nie mogę zagwarantować, że nikt nie będzie. Wolę raczej błądzić po stronie przyjemności dla użytkownika niż frustracji. Dodatkowo, jeśli kopiujesz wartości z, powiedzmy, wyciągu bankowego online, może on już być sformatowany za pomocą $ i, i. i wszystkie inne postacie. –