Jak rozwiązujecie problem przecinka dziesiętnego w formularzach z tabeli?
Polska ortografia i przyzwyczajenia użytkowników nakazują stosować przecinek dziesiętny.
W formularzach niepowiązanyc z tabelą można zrobić gsub(’.’, ‘,’) (lub odwrotnie przy czytaniu params) w polach zawierających dane numeryczne.
Ale jak to generalnie zrobić dla tabeli - dla pół :decimal lub :float ?
gsuba też możnaby robić ale jak formularz generuje się sam a potem jest od razu update_attributes to nie ma jak tego wepchnąć.
Pewnie dałoby się zrobić jakiś automat działający w dwie strony i obsługujący validates_numericality_of.
[code=ruby]class Float
def to_fs(opts={})
delimiter=opts[:delimiter] || “”
separator=opts[:separator] || “,”
parts = to_s.split(’.’)
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, “\1#{delimiter}”)
parts.join(separator)
end
end
class String
def to_fs(opts={})
Float(gsub(’,’,’.’))
end
end
n= 1234.43.to_fs #=> “1234,43”
n.to_fs #=> 1234.43[/code]
nie ładnie ale działa
Tzn. ogólnie “nigdy nie wiesz kto jest po drugiej stronie” – jeśli attributes[:key] pozwala się dobrać do “surowego” atrybutu z gwarancją braku pośredników, to ja zdecydowanie wolę takie rozwiązanie niż super i modlenie się żeby któryś plugin mi gdzieś-po-drodze nie namieszał w łańcuchu wywołań.
(nienawidzę monkeypatchingu, czy już o tym pisałem? )
Jak tak sobie myślę nad tym, to i tak wszystko zależy od sytuacji. Jeżeli jeden model dziedziczy po drugim, to czasami wskazane by było, żeby aplikowały się też writery. W każdym razie w tym akurat wypadku nie ma chyba jednego “dobrego” wyjścia
[quote=Tomash]Tzn. ogólnie “nigdy nie wiesz kto jest po drugiej stronie” – jeśli attributes[:key] pozwala się dobrać do “surowego” atrybutu z gwarancją braku pośredników, to ja zdecydowanie wolę takie rozwiązanie niż super i modlenie się żeby któryś plugin mi gdzieś-po-drodze nie namieszał w łańcuchu wywołań.
(nienawidzę monkeypatchingu, czy już o tym pisałem? )[/quote]
No to pretensje do tych co używają MP ;). Jeśli chodzi o moje rozwiązanie to uważam je za dobre. A jak railsy zmienią implementację i self[:foo] nie będzie działać to co?
Dzięki za wskazówki. Działające u mnie rozwiązanie poniżej.
W modelach dodaję dla wybranych pól:
validates_numericality_of :kwota, :allow_blank=>true
def kwota=(x)
x=x.to_s.sub(',','.').gsub(' ','')
super
end
sub dla przecinka - bo dwa przecinki wyłapie walidacja. Zapis z kropką dziesiętną też przejdzie.
A separatorem tysięcy może być spacja lub _ . W miarę elastyczne dla użytkowników.
W helperze do formularza:
case type
...
when 'decimal'
value = record.respond_to?(name + "_before_type_cast") ? record.send(name + "_before_type_cast") : record.send(name)
params[:value]= value.to_s.sub('.',',')
cont.text_field name, params
...
I na razie jest ok …