我有
string = "$575.00 "
string.to_f
// => 0.0
string = "575.00 "
string.to_f
// => 575.0
进入的值是这种格式,我需要插入一个十进制任何建议的数据库字段
"$575.00 "
答案 0 :(得分:5)
我们经常这样做,因此我们写了一个名为String
的{{1}}扩展程序:
cost_to_f
我们会在class String
def cost_to_f
self.delete('$,').to_f
end
end
中存储此类扩展程序。
然后您可以简单地致电:
config/initializers/extensions/string.rb
如果你很少使用这种方法,最好的办法就是简单地创建一个函数,因为向核心类添加函数并不是我会轻易推荐的东西:
"$5,425.55".cost_to_f #=> 5425.55
如果你需要多个课程,你可以随时将它放在一个模块中,然后def cost_to_f(string)
string.delete('$,').to_f
end
将模块放在任何你需要的地方。
还有一个小问题。您提到在将字符串写入数据库时需要处理该字符串。使用ActiveRecord,最好的方法是:
include
编辑:已更新为使用class Item < ActiveRecord::Base
def price=(p)
p = p.cost_to_f if p.is_a?(String)
write_attribute(:price, p)
end
end
!
答案 1 :(得分:3)
这么多答案......在给出自己的答案之前,我会尝试总结一下现有的所有答案。
1. string.gsub(/[\$,]/, '')
string.gsub!(/^\$/, '')
2. string[1..-1]
3. string.slice(0) # => "ome string"
4. s/^.//
(g)sub
和regexp仅用于删除字符? String#tr
更快更短。 String#delete
甚至更好。String#[]
我的建议是: 如果你没有美元,但是日元怎么办?或者如果你在数字之前没有任何东西怎么办? 所以我更喜欢:
string[/\d.+/]
这将裁剪前导非小数符号,以防止to_f
正常工作。
P.S。:顺便说一下。众所周知,float
是存储金额的不良做法。
Use Float or Decimal for Accounting Application Dollar Amount?
答案 2 :(得分:0)
你可以使用正则表达式:
s/^.//
正如laways,这是PCRE语法。
在Ruby中,您可以使用字符串类的sub()
方法替换字符串:
result = string.sub(/^./,"")
这应该有用。
<强> [编辑] 强>
好的,有人问gsub()
的用途是什么:
gsub()
的行为类似sub()
,但在PCRE中使用/g
修饰符(全局替换):
s/a/b/
PCRE中的是
string.sub(/a/, "b")
和
s/a/b/g
是
string.gsub(/a/, "b")
在Ruby中
答案 3 :(得分:0)
你可以尝试这样的事情。
string = string[1..-1] if string.match(/^\$/)
或者这个。
string.gsub!(/^\$/, '')
请记住在Regexp中添加反斜杠,它也意味着“字符串结束。”
答案 4 :(得分:0)
我使用的(而不是正则表达式)只是slice!
类中的内置String
方法。例如,
s = "Some string"
s.slice!(0) # Deletes and returns the 0th character from the string.
s # => "ome string"