Polski format liczb w formularzach - Rails 3.1.2

Witam
Czy jest jakiś sposób, żeby zmusić Railsy do stosowania polskich formatów liczb?
Wyświetlanie nie jest problemem, number_to_currency z odpowiednimi parametrami wyświetla wszystko tak jak trzeba.

Problem jest przy formularzach do wprowadzania wartości pieniężnych.
number_field chce wartości podawanych z “.” zamiast “,”.

W pliku pl.yml mam:

number: currency: format: delimiter: ! ' ' format: ! '%u %n' precision: 2 separator: ! ',' significant: false strip_insignificant_zeros: true unit: PLN format: delimiter: ! ' ' precision: 3 separator: ! ',' significant: false strip_insignificant_zeros: false
cały plik pobrany z https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/pl.yml

Jak uporać się z problemem polskich separatorów w liczbach?

Dzięki
Pozdrawiam
Tomek

zazwyczaj na poziomie js, po stronie user skrypt js obserwujacy input i podminiajacy, albo jakis before filter i podmiana po stronie serwera

before_validate w modelu

before_validate jest ok w przypadku nowych rekordów.
Niestety nie bardzo da się to wykorzystać przy edycji. Chyba wypada, że js będzie rozwiązaniem.

Może w ten deseń?

Czemu?

Przyznam, że dopiero zaczynam poznawanie railsów i może czegoś jeszcze nie doczytałem, ale z obecnie posiadanej wiedzy before_validate jest wykonywane po stronie serwera, czyli po przesłaniu formularza.
Nie widzę możliwości wykorzystania tego przy wyświetlaniu formularza do edycji, być może źle patrze :wink:
Przy nowym rekordzie:
Formularz -> input field (wpisana przez użytkownika wartość: 123,45)-> before_validate lub before_save -> wartość: 123.45 -> zapis do bazy
before_vallidate lub before_safe zamienia “,” na “.” dla kolumny decimal lub usuwa “,” dla kolumny integer

Przy edycji:
Odczyt z bazy -> wartość: 123.45 -> tu_właśnie_jest_problem -> input field (wartość: 123,45) -> formularz
tu_właśnie_jest_problem powinien zamienić “.” na “,” dla decimal lub wstawić “,” przed dwoma ostatnimi cyframi dla integer

Spróbuję zaraz rozwiązania z i18n_alchemy

w edit

@model.pole.gsub!(’,’, ‘.’)

czy cos w ten desen,

jedna z mozliwosci, mozna inaczej, moze lepiej, ale powinno dac ci poglad na sprawe.

W kontrolerze masz cos takiego

def edit @model = Model.find[:id] end
dodajesz tam ta linie ponizej czyli tera masz

def edit @model = Model.find[:id] @mode.price.gsub!(',','.') end
i po sprawie

Ja bym w edycji nie zmieniał kropki na przecinek, śmiem twierdzić że ludzie i tak ogarną o co chodzi.

Jeśli już to rozważałbym zrobienie gettera dla tego atrybutu, który zamieniał by liczbę w string a w nim kropke na przecinek

[quote=gotar]def edit @model = Model.find[:id] @mode.price.gsub!(',','.') end
i po sprawie[/quote]
Przecież ten przecinek czy kropka to tylko warstwa widoku, więc po co zmieniać zawartość zmiennej.

Pisałeś w pierwszym poście, że przy wyświetlaniu możesz skorzystać z number_to_currency, więc w czym problem?

Ew. tak jak napisał Piotr powyżej, nadpisać getter (ale wtedy otrzymujemy string zamiast inta/floata, więc może być potem problem z jakimiś działaniami arytmetycznymi na nim)

No jak pisałem, można inaczej i lepiej, chodziło o to by kolega zobaczył że można i skąd co się bierze.

Działania arytmetyczne będą mi potrzebne, więc wolałbym zostawić to tak jak jest.
Chodzi tylko o wyświetlenie liczby z przecinkiem w polach do wprowadzania ceny przy edycji i możliwość wpisania liczb z przecinkiem a nie z kropką.

W formularz mam:

<%= f.label :amount %><br /> <%= f.text_field :amount, :size => 5 %>
Jest to cześć zagnieżdżonego formularza do obiektu nadrzędnego zgodnie z http://railscasts.com/episodes/197-nested-model-form-part-2

Dawniej działał całkiem nieźle delocalize gem (miałem zresztą swoją wersję) nie wiem jak jest teraz.

[quote=bresio]W formularz mam:

<%= f.label :amount %><br /> <%= f.text_field :amount, :size => 5 %>
[/quote]

<%= f.label :amount %><br /> <%= f.text_field :amount, :size => 5, :value => number_to_currency(@amount) %>
(oczywiście zamiast @amount podstawiasz to co tam wykorzystujesz, @object.amount czy coś takiego, chyba f.object.amount zadziała, ale nie sprawdzałem)

próby z wykorzystaniem https://github.com/carlosantoniodasilva/i18n_alchemy

model danych:

[code]class Transaction < ActiveRecord::Base
has_many :checks
accepts_nested_attributes_for :checks, :allow_destroy => true
end

class Check < ActiveRecord::Base
belongs_to :transaction
include I18n::Alchemy[/code]
W kontrolerze obiektu User dla akcji show, i edit dodałem

@transaction.checks.collect! { |c| c.localized  }

Efekt jest taki, że przy edycji pola formularza uzupełniane są prawidłowo, tj. z przecinkiem
Zapisanie formularza z liczbami z przecinkiem działa poprawnie.

Problem jest przy tworzeniu nowego obiektu transaction.

def create @transaction = Transaction.new(params[:transaction]) ....
w params[:transaction] przekazywana jest prawidłowa wartość amount np. (129,99).

@transaction.checks.each { |c| c.amount } => 129.0
wywołanie metody localized (tak jak w przypadku edit) na obiektach @transaction.checks jest bez sensu po utworzeniu obiektu @transaction.

Jedyne co mi przychodzi do głowy, zamiana metody @transaction.new na taką, która przy wywołaniu najpierw stworzy check, wywoła na nim check.localized, a później załaduje dane z formularza.
Dobrze myślę, czy są jakieś prostsze sposoby?

Bardziej na tacy już się chyba nie da :stuck_out_tongue: