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