2010-08-29 197 views
4

我有剥字符串的第一个字符

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

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

进来的值是这种格式,我需要插入即十进制任何建议

"$575.00 " 
+2

退房这种宝石:http://github.com/tobi/money_column – 2010-08-29 19:52:44

+1

你有答案告诉你如何删除美元符号,但只有一个人提到,你不应该使用浮动货币。 Float(由IEEE定义)并不精确,当你处理金钱时,你需要精确(每当你做数学时你都不会失去人的金钱)。为了看清我的观点,试试'puts(0.2-0.1,1.2-0.1,1.2-1.1)'不知道更多关于你的用例,我不知道该怎么建议。 – 2010-08-30 02:14:03

+0

@Joshua,好建议:'美元,美分=字符串[1 ..- 1] .delete(',')。split(/./)。collect {| i |一世。to_i(10)}' – 2010-08-30 14:37:11

回答

5

我们这样做经常我们写了一个扩展名为Stringcost_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

0

您可以将数据库字段使用正则表达式:

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中

0

你可以尝试这样的事情。

string = string[1..-1] if string.match(/^\$/) 

或者这个。

string.gsub!(/^\$/, '') 

请记住将反斜杠放在您的正则表达式中,它也意味着“字符串结束”。

0

我会用的(而不是正则表达式)只是String类中内置的slice!方法。例如,

s = "Some string" 
s.slice!(0) # Deletes and returns the 0th character from the string. 
s # => "ome string" 

Documentation here.

3

所以很多答案...我会试着总结一下所有已可提供,之前给出自己的答案。

1. string.gsub(/[\$,]/, '') 
    string.gsub!(/^\$/, '') 
2. string[1..-1] 
3. string.slice(0) # => "ome string" 
4. s/^.// 
  1. 为什么(g)sub和正则表达式只是为了删除一个角色? String#tr更快更短。 String#delete更好。
  2. 好,快,简单。反向索引的功能。
  3. 嗯...看起来像返回“S”。因为它是String#[]的别名
  4. Perl? /我正在讨论问题标签...

而我的建议是: 如果你没有美元,但yena怎么办?或者如果在数字之前甚至没有任何东西? 所以我会更喜欢:

string[/\d.+/] 

这将裁剪领先的非十进制符号,防止to_f运行良好。

P.S .:顺便说一句。众所周知,float是储存金额的不良做法。 Use Float or Decimal for Accounting Application Dollar Amount?

+0

GSUB()的作用类似于'/ g'改性剂PCRE的: S/A/B/ 是 string.sub(/ A /, “B”) 和 S/A/B /克 是 string.gsub(/ A /, “b”) 在红宝石 – polemon 2010-08-29 19:15:35

+0

我知道井Perl的单曲//'和红宝石的'gsub'。但问题是关于红宝石。 – Nakilon 2010-08-29 19:28:25

+0

如果你的价值中有逗号,该怎么办? 'delete(“,$”)'是比我们的'gsub'更好的解决方案,谢谢指出。下次发表评论! – wuputah 2010-08-30 00:51:51