从 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 中的整数或小数中去除逗号的主要内容,如果未能解决你的问题,请参考以下文章

如何从浮点输入中去除逗号?

Android中的小数点或小数逗号

检测 VB.Net 中数字的文化,即小数点/千位分隔符的句点或逗号

如何从 .NET 框架 C# 中的文本框中删除双逗号?

【js】金钱格式化(每三位逗号分隔)的方法

在swift中将逗号添加到字符串整数[关闭]