在逗号中将逗号更改为点类型十进制

时间:2014-04-29 07:41:18

标签: ruby-on-rails ruby ruby-on-rails-3.2 gsub

我有模型产品,该模型具有十进制类型的属性价格(: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$ " />

2 个答案:

答案 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