2013-07-15 27 views
9

ユーザー番号の入力を11,5から11.5のように変換するにはどうすればよいですか?カンマを区切り文字としてポイントに変換する

私は、コールバックとして次のことを試してみました:

before_validation :comma_to_delimiter 

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

しかし、これは動作しません。ユーザーが区切り記号として入力したいものを入力できるようにしたい - 現在、ユーザーがポイントの代わりにカンマを使用すると、アプリケーションでエラーがスローされます。

+0

どのようなタイプの値self.priceが説明できますか? – Slicedpan

+0

これをレールアプリに表示するには変更しますか? –

+0

いいえ、表示方法については気にしません。私はロケールを通してそれをとった。 Priceは、区切り文字としてポイントを持つfloatとして格納される浮動小数点値です。問題は、ドイツでは、区切り文字としてポイントではなくカンマで区切って入力することです。したがって、ドイツ人が「5,5」で入力したとしても、それはまだ「5.5」として保存する必要があります。そして、誰かが最初に「5.5」などのように正しく入力すると、何も変更する必要はありません。どのようにこれを行うにはどのようなアイデア? – weltschmerz

答えて

9

あなたがやっていることが最良の方法ではないかもしれないので、おそらく誰かがより良いアプローチで答えることができます。しかし、あなたのラインを稼働させるには、実際に変更を持続させる必要があります。

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

変更を返すだけですが、コールバックのどこにも移動しません!

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

オブジェクト内で変更が維持されます。

+0

2番目のバージョンはself.priceの値を変更しません – Slicedpan

+0

私はコードをローカルで実行しました。テストされ、正確にはRails 3で説明されているように動作します。 – Matt

+0

はい、ただself.priceがすでに文字列であれば、それは変更されます。私はそれが浮動小数点数であると仮定していた(質問に誤解されている可能性があります!) – Slicedpan

11

カンマは標準通貨区切り文字で、ユーザーが区切り文字の変換を手動で処理しない限り、ユーザーがフォームに「19,99」を入力すると「19.00」として保存されます。私は、これを解決する正しい方法は、カスタム属性設定ツールを書くことだと思います。

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

すべてのfloat属性に対してこれをグローバルに処理するといいでしょう。 – Vassilis

関連する問題