我有模型产品,该模型具有十进制类型的属性价格(:precision => 20, :scale => 2
)
在表单上,我使用价格字段的格式为:3.000,00
,提交表单时,价格更改为3.00
。我希望价格仍然3,000.00
不要3.00
使用rails console进行测试
irb(main):001:0> p = Product.create(:price => "3.000,00") ←[1m←[36m
(0.0ms)←[0m ←[1mBEGIN←[0m ←[1m←[35mSQL (72.0ms)←[0m INSERT INTO
"products" ("created_at", "price" "updated_at") VALUES ($1, $2, $3)
RETURNING "id" [["created_at", Tue, 29 Apr 2 014 14:07:25 WIB
+07:00], ["price", #<BigDecimal:4c218f0,'0.3E1',9(18)>], ["updated_at", Tue, 29 Apr 2014 14:07:25 WIB +07:00]] ←[1m←[36m
(11.0ms)←[0m ←[1mCOMMIT←[0m
=> #<Product id: 8, price: #<BigDecimal:4bd5588,'0.3E1',9(18)>, created_at: "20 14-04-29 07:07:25", updated_at: "2014-04-29 07:07:25">
irb (main):002:0> p.price.to_s
=> "3.0"
我尝试使用gsub
更改逗号指向before_save
并存储到数据库,但价格始终更改为数据库上的3.00
。
before_save :comma_to_delimiter
def comma_to_delimiter
self.price = self.price.gsub(/[.,]/, '.' => ',', ',' => '.')
end
我想这样:
当我输入3.000,00
到字段价格,数据库3,000.00
和查看价格3.000,00
时
我无法弄清楚如何做到这一点。 谢谢
注意:我使用jquery-maskMoney的字段价格格式为:
$("#demo4").maskMoney();
<input type="text" id="demo4" data-thousands="." data-decimal="," data-prefix="R$ " />
答案 0 :(得分:2)
删除字符串中的分隔符,因为在模型中保存数据时,需要使用&#39;。&#39;或&#39;,&#39;作为小数分隔符。尝试这样的事情。
before_save :format_number
def format_number
self.price = self.price.gsub(/[.,]/, '.' => '', ',' => '.')
end
出于相反目的,您可以使用NumberHelper,因此您可以格式化为&#39; R $&#39;
<%= number_to_currency(3000.00, unit: "R$ ", separator: ",", delimiter: ".", precision: 2) %> #=> "R$ 3.000,00"
答案 1 :(得分:0)
您的格式是问题
您正在向您的数据库发送3.000,00
的值。 MYSQL's decimal type旨在将decimal point
置于数据的中心。我需要学习更多有关数学的知识,以便给出一个真正的定义(关于浮点等),但这是我从MYSQL中注意到的:
DECIMAL列的声明语法仍为DECIMAL(M,D), 虽然参数的值范围有所改变:
M是......
D是小数点右边的位数( 规模)。它的范围为0到30,且不得大于M.
这告诉我,MYSQL使用.
确定要存储的号码因为您要发送3.000,00
,所以它将其视为3.00
<强>修正强>
对解决方案感兴趣,我查看了Wikipedia's article on decimal handling - 世界上有24%的人使用,
作为radix point
要处理此问题,您需要translate MYSQL to handle the ,
,但这不是其功能的一部分。相反,我会尝试在保存
虽然您可以手动执行此操作,但this answer提供了delocalize gem