剥去字符串的第一个字符
我有
string = "$575.00 " string.to_f // => 0.0 string = "575.00 " string.to_f // => 575.0
进来的值是这种格式,我需要插入一个十进制的数据库字段任何建议
"$575.00 "
我们经常这样做,我们经常写一个名为cost_to_f
String
扩展:
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
!
这么多的答案……在给出自己的答案之前,我会尝试总结现在可用的所有内容。
1. string.gsub(/[\$,]/, '') string.gsub!(/^\$/, '') 2. string[1..-1] 3. string.slice(0) # => "ome string" 4. s/^.//
- 为什么
(g)sub
和regexp只是为了删除一个字符?String#tr
更快更短。String#delete
更好。 - 好,快,简单。 反向索引的力量。
- 嗯…看起来它返回“S”。 因为它是
String#[]
的别名 - Perl的? /我正在检查问题标签……
我的建议是:如果你没有美元,但是日元怎么办? 或者如果你在数字之前没有任何东西怎么办? 所以我更喜欢:
string[/\d.+/]
这将裁剪前导非小数符号,以防止to_f
正常工作。
PS:顺便说一下。 众所周知, float
是存储金额的不良做法。 使用Float或Decimal来计算会计应用的美元金额?
你可以尝试这样的事情。
string = string[1..-1] if string.match(/^\$/)
或这个。
string.gsub!(/^\$/, '')
记得在你的Regexp中添加反斜杠,它也意味着“字符串结尾”。
你可以使用正则表达式:
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中
我使用的(而不是正则表达式)只是内置slice!
String
类中的方法。 例如,
s = "Some string" s.slice!(0) # Deletes and returns the 0th character from the string. s # => "ome string"
文档在这里。