从 Rails 中的整数或小数中去除逗号
Posted
技术标签:
【中文标题】从 Rails 中的整数或小数中去除逗号【英文标题】:Stripping commas from Integers or decimals in rails 【发布时间】:2011-06-30 22:36:45 【问题描述】:是否有整数或小数的 gsub 等价物? gsub 应该使用整数吗?基本上我只是想将十进制输入到 ruby 表单中,以及用户能够使用逗号的内容。例如,我希望用户能够输入 1,000.99。
我尝试过使用
before_save :strip_commas
def strip_commas
self.number = self.number.gsub(",", "")
end
但得到以下错误“未定义的方法 `gsub' for 8:Fixnum”,其中“8”被用户输入的任何数字替换。
【问题讨论】:
数字字段是浮点数吗? Rails 应该为您处理转换,因此逗号不会真正存在于数据中。 该字段为十进制。当我在字段中输入类似 2,000 的内容时,我的 mysql 数据库中会得到“2”。 【参考方案1】:如果您的字段是 Fixnum,则它永远不会有逗号,因为 Rails 必须将用户输入转换为数字才能将其存储在那里。
但是,它将通过在输入字符串上调用 to_i 来实现,这不是您想要的。 将普通设置器覆盖为类似
def price=(num)
num.gsub!(',','') if num.is_a?(String)
self[:price] = num.to_i
end
未经测试,但类似的东西应该可以工作......
您需要在输入仍然是字符串时使用逗号。
编辑:
如 cmets 中所述,如果您想接受小数,并创建一个不是整数的东西,您需要与 String.to_i
不同的转换。此外,不同的国家/地区对数字标点符号有不同的约定,因此这不是一个完整的解决方案。
【讨论】:
完美运行!我只需要将 to_i 更改为 to_d 。由于 Fixnum 中没有逗号,我快疯了。谢谢。 确实,我忘了你也想允许小数,我们处理的是 Fixnum 而不是整数......但你明白了。我会编辑答案。 请注意,这可能会让您不知所措,因为欧洲人会输入 100,00,意思是 100.00,您会将其解释为 10000。我根据经验说话。 幸运的是,这些用户都来自美国。至少对于这个应用程序。但在未来,有没有更好的方法来做到这一点,而且与区域无关? 很好的答案!self[:price] = num.to_f
是正确的方法。我试过self.price = num.to_f
它引发了SystemStackError (stack level too deep)
【参考方案2】:
试试self.number.gsub(/\D/, '')
。也就是说,删除所有不是数字的东西。 Regexen 不区分整数、浮点数、小数等。它都是字符串。而且 Rails 不会为您正确转换它,因为它只是在上面调用 #to_i
或 #to_f
。
编辑:
实际上:self.number.gsub(/[^\d\.]/, '').to_f
:所有不是数字或小数点的东西,并将其转换为浮点数。
【讨论】:
您不需要转义'.'
,因为当它在'[.]'
范围内时,它会失去其特殊性并自动成为文字。所以[^\d.]
更正确。让它逃脱是可以的,因为它可以作为行为的视觉提醒。以上是关于从 Rails 中的整数或小数中去除逗号的主要内容,如果未能解决你的问题,请参考以下文章