剥去字符串的第一个字符

我有

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/^.// 
  1. 为什么(g)sub和regexp只是为了删除一个字符? String#tr更快更短。 String#delete更好。
  2. 好,快,简单。 反向索引的力量。
  3. 嗯…看起来它返回“S”。 因为它是String#[]的别名
  4. 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" 

文档在这里。