剥去字符串的第一个字符

时间:2010-08-29 18:49:20

标签: ruby-on-rails ruby

我有

string = "$575.00 "
string.to_f
// => 0.0

string = "575.00 "
string.to_f
// => 575.0

进入的值是这种格式,我需要插入一个十进制任何建议的数据库字段

"$575.00 " 

5 个答案:

答案 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/^.//
  1. 为什么(g)sub和regexp仅用于删除字符? String#tr更快更短。 String#delete甚至更好。
  2. 好,快,简单。反向索引的力量。
  3. 嗯...看起来像是“S”。因为它是String#[]
  4. 的别名
  5. Perl的? /我正在检查问题标签......
  6. 我的建议是: 如果你没有美元,但是日元怎么办?或者如果你在数字之前没有任何东西怎么办? 所以我更喜欢:

    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"

Documentation here.