【问题标题】:Convert comma to point as delimiter将逗号转换为点作为分隔符
【发布时间】:2023-03-28 06:40:01
【问题描述】:

如何将用户编号输入从 11.5 转换为 11.5?

我尝试了以下回调:

before_validation :comma_to_delimiter

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

但这不起作用。我希望用户能够输入任何他想要的分隔符 - 目前,当用户使用逗号而不是点时,应用程序会引发错误。

【问题讨论】:

  • 你能解释一下 self.price 是什么类型的值吗?
  • 您想更改它以在 Rails 应用程序中显示,对吗?
  • 不,我不在乎它是如何显示的。我已经通过语言环境接受了这一点。价格是一个浮点值,应该以浮点数形式存储,点为分隔符。问题是在德国,人们输入逗号而不是点作为分隔符。因此,即使德国人输入“5,5”,它仍应存储为“5.5”。如果有人一开始就正确输入了它,例如“5.5”,则无需更改任何内容。知道怎么做吗?

标签: ruby-on-rails validation delimiter


【解决方案1】:

你正在做的可能不是最好的方法,所以也许有人可以用更好的方法来回答。但是要让你的生产线正常工作,你需要让它真正持久化变化。

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

只会返回更改,但这不会在回调中进行!

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

将在对象中保留更改。

【讨论】:

  • 第二个版本不会改变self.price的值
  • 我已经在本地运行了代码,而且肯定可以,你试过了吗?完全按照 Rails 3 中的描述进行测试和工作。
  • 是的,刚刚意识到,如果 self.price 已经是一个字符串,那么它会改变。我一直假设它是一个浮点数(可能误解了这个问题!)
  • 不保存逗号后的数字。如果5,75,则保存5.00。还是只是为了我?谢谢!
  • 与@Gediminas 相同的问题我无法在模型中执行此操作。数字被截断。这可能是因为数字是在表单中输入的,并且显示为字符串。当它到达模型时,转换就像"5,5".to_f 一样完成,它会截断数字小数部分。似乎钩子(before_validation..)都是在应用字段类型之后发生的。然后我已经完成了控制器的更改..
【解决方案2】:

在某些国家/地区,逗号是标准货币分隔符,如果用户在表单中输入“19,99”,除非您手动处理分隔符转换,否则它将保存为“19.00”。我认为解决这个问题的正确方法是编写自定义属性设置器。

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

【讨论】:

  • 为所有浮点属性全局处理这个会很好。
  • @Vassilis 知道如何在全球范围内处理这个问题吗?
  • @BenjaminJ.Benoudis 我认为最合适的方法是使用助手... number_to_currency(1234567890.50, separator: ".", delimiter: ",")
  • @BenjaminJ.Benoudis number_to_currency 也支持 i18n,这意味着您可以在 yml 文件中全局设置格式。看到这个:stackoverflow.com/questions/7237592/…
  • @Vassilis 谢谢,但它不是用于显示,而是用于接受带逗号的数字,以及输入表单中带点的数字。我没有找到任何全局简单的解决方案。
猜你喜欢
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多