【问题标题】:Change comma to point type decimal in rails在rails中将逗号更改为点类型小数
【发布时间】:2014-04-29 07:41:17
【问题描述】:

我有一个模型产品,该模型具有十进制类型的属性价格 (:precision => 20, :scale => 2) 在表单中,我使用的价格字段格式如下:3.000,00,提交表单时,价格更改为 3.00。我希望价格是3,000.00,而不是3.00

使用 Rails 控制台测试

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$ " />

【问题讨论】:

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


【解决方案1】:

删除字符串中的分隔符,因为在模型中保存数据时,它需要'.'或 ',' 作为小数分隔符。试试这样的。

before_save :format_number

def format_number
  self.price = self.price.gsub(/[.,]/, '.' => '', ',' => '.')
end

对于您的视图中的相反目的,您可以使用NumberHelper,因此您可以格式化为“R$”

<%= number_to_currency(3000.00, unit: "R$ ", separator: ",", delimiter: ".", precision: 2) %> #=> "R$ 3.000,00"

【讨论】:

  • 一个完美的答案,但有人可以解释一下这是如何工作的:self.price.gsub(/[.,]/, '' => ',', ',' => '.' ) ?
  • 好吧,它只是说,当一个'。'字符被正则表达式找到,它应该被替换为 '' ,如果匹配一个 ',' ,它被替换为 '.' .这就是我对它的解释和工作。
【解决方案2】:

你的格式是问题

您将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

【讨论】:

  • 是的,有钱,我有 readed this answerthis question ,现在我会试试看。谢谢
  • 顺便说一句,我用的是 PostgreSQL
  • 对不起,我是想问的!我相信格式应该仍然适用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多