string = "$575.00 "
string.to_f
// => 0.0
string = "575.00 "
string.to_f
// => 575.0
进来的值是这种格式,我需要插入即十进制任何建议
"$575.00 "
string = "$575.00 "
string.to_f
// => 0.0
string = "575.00 "
string.to_f
// => 575.0
进来的值是这种格式,我需要插入即十进制任何建议
"$575.00 "
我们这样做经常我们写了一个扩展名为String
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
如果你需要在多个类,你可以随时把它放在一个模块中,然后include
该模块无论你需要它。
还有一个消息。您提到您在写入数据库时需要处理该字符串。用ActiveRecord,要做到这一点,最好的办法是:
class Item < ActiveRecord::Base
def price=(p)
p = p.cost_to_f if p.is_a?(String)
write_attribute(:price, p)
end
end
编辑:更新后可使用String#delete
!
您可以将数据库字段使用正则表达式:
s/^.//
正如这样,这是PCRE语法。
在Ruby中,你可以使用String类的sub()
方法来替换字符串:
result = string.sub(/^./,"")
这应该工作。
[编辑]
好,有人问什么是gsub()
是:
gsub()
的作用就像sub()
但在PCRE的/g
修饰符(对于全局替换):
s/a/b/
in PCRE is
string.sub(/a/, "b")
和
s/a/b/g
是
string.gsub(/a/, "b")
在Ruby中
你可以尝试这样的事情。
string = string[1..-1] if string.match(/^\$/)
或者这个。
string.gsub!(/^\$/, '')
请记住将反斜杠放在您的正则表达式中,它也意味着“字符串结束”。
我会用的(而不是正则表达式)只是String
类中内置的slice!
方法。例如,
s = "Some string"
s.slice!(0) # Deletes and returns the 0th character from the string.
s # => "ome string"
所以很多答案...我会试着总结一下所有已可提供,之前给出自己的答案。
1. string.gsub(/[\$,]/, '')
string.gsub!(/^\$/, '')
2. string[1..-1]
3. string.slice(0) # => "ome string"
4. s/^.//
(g)sub
和正则表达式只是为了删除一个角色? String#tr
更快更短。 String#delete
更好。String#[]
的别名而我的建议是: 如果你没有美元,但yena怎么办?或者如果在数字之前甚至没有任何东西? 所以我会更喜欢:
string[/\d.+/]
这将裁剪领先的非十进制符号,防止to_f
运行良好。
P.S .:顺便说一句。众所周知,float
是储存金额的不良做法。 Use Float or Decimal for Accounting Application Dollar Amount?
退房这种宝石:http://github.com/tobi/money_column – 2010-08-29 19:52:44
你有答案告诉你如何删除美元符号,但只有一个人提到,你不应该使用浮动货币。 Float(由IEEE定义)并不精确,当你处理金钱时,你需要精确(每当你做数学时你都不会失去人的金钱)。为了看清我的观点,试试'puts(0.2-0.1,1.2-0.1,1.2-1.1)'不知道更多关于你的用例,我不知道该怎么建议。 – 2010-08-30 02:14:03
@Joshua,好建议:'美元,美分=字符串[1 ..- 1] .delete(',')。split(/./)。collect {| i |一世。to_i(10)}' – 2010-08-30 14:37:11