我遇到了Rails应用程序在我的mysql数据库中存储小数的问题。我有一个包含两个字段的表单:" amount"和"货币"。当我在"中输入一个十进制值"字段(例如1,22)Rails只将1存储在数据库中。
我的日志文件如下所示:
Started POST "/cashamounts" for 127.0.0.1 at 2012-02-04 13:23:54 +0100
Processing by CashamountsController#create as HTML
Parameters: {"utf8"=>"✓","authenticity_token"=>"QpWGfEtDR1tc7wTFmZZst9gYjKAyXtRypilsxDE9Tzs=", "cashamount"=>{"currency_id"=>"eur", "amount"=>"1,22"}, "commit"=>"Create Cashamount"}
[1m[36mCurrency Load (2.8ms)[0m [1mSELECT `currencies`.* FROM `currencies` ORDER BY name[0m
[1m[35m (0.2ms)[0m BEGIN
[1m[36mSQL (0.3ms)[0m [1mINSERT INTO `cashamounts` (`amount`, `created_at`, `currency_id`, `updated_at`) VALUES (1, '2012-02-04 12:23:54', 'eur', '2012-02-04 12:23:54')[0m
[1m[35m (0.6ms)[0m COMMIT
Redirected to http://localhost:3000/cashamounts/8
Completed 302 Found in 94ms
因此,金额正确存储在参数中,但未正确插入数据库。我检查了我的db / schema.rb文件。列的行"金额"是:
t.decimal "amount", :precision => 10, :scale => 2
我还能在哪里找到问题?
PS。我开始使用money gem,但这显示了同样的问题:","之后的所有数字。没有存储。
答案 0 :(得分:6)
这个问题有点陈旧,但对于未来的访问者,我相信答案可以在以下的“Gotcha”部分找到:
http://torontoprogrammer.ca/2010/05/decimal-numbers-in-rails-and-mysql/。
基本上,当你设置十进制字段时,你必须指定scale
参数来说明小数点右边应该有多少个位置。否则,mysql假定您希望所有数字都在小数点左侧。
这个问题也让我感到困惑。在我的开发环境(使用sqlite)中一切正常,但在生产中(使用mysql),我的“十进制”数字的小数部分被截断了。
答案 1 :(得分:2)
1,22是十进制值的欧洲表示法,而1.22是英国,美国和澳大利亚的惯例。您可能需要设置语言环境。
http://guides.rubyonrails.org/i18n.html#optional-custom-i18n-configuration-setup
在初始化程序中:
I18n.default_locale = :fr
或者在config / application.rb
的末尾config.i18n.default_locale = :fr
答案 2 :(得分:0)
问题是Rails需要小数点而不是逗号。如果这是用户输入,请尝试将,
替换为.
,然后再保存到数据库。