2010-08-29 216 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

相關問題