2009-05-28 61 views
1

分離製表符分隔的文件後,我在字符串變量中具有我需要的值。不幸的是,這個文件的來源超出了我的控制範圍。Ruby專家:你能幫助/建議改進這一行的Ruby代碼嗎?

這裏有什麼樣的價值可能會舉行三次確切例如:

  1. 「5.344」
  2. 「-2.345」
  3. 「-.977」

公告空白,小數點前面不加'0',雙引號在字符串中。一旦我有每一個在我的領域變量,這是我目前在做什麼:

int_val = BigDecimal(value_as_string.gsub(/-\./,"-0.").gsub(/\"/,'').strip).round(0).to_i 

我需要每一個四捨五入到最接近的整數(.to_i向下取整)。任何更好的想法都會非常感謝,因爲我可以幫助,但這太臭了!?

回答

7
def round(s) 
    s.to_f.round 
end 

round("5.344") # 5 
round("-2.345") # -2 
round("-.977") # -1 
+0

感謝您的答案。雖然它仍然需要一些額外的,因爲我的變量是這樣的: round('「5.344」') 也就是說,該字符串包含雙引號。 – tsdbrown 2009-05-28 16:33:40

0
def round(str) 
    val = BigDecimal(str.gsub(/-\./,"-0.").gsub(/\"/,'').strip) 

    if val < 0 then 
    return val.floor.to_i 
    else 
    return val.ceil.to_i 
    end 
end 
1

這個表達式將清潔串,除去everyting但數字, - 在所述第一GSUB或十進制點和所述第二GSUB將前增加一個0。 (保留 - 如果它存在的話)

some_value.gsub(/[^-\.0-9]/, '').gsub(/^(-?)(\.)/,'\10\2') 

然後你將需要將它舍入,to_f.round應該足夠了。所以最後的東西看起來像

def myround(value) 
    value.gsub(/[^-\.0-9]/, '').gsub(/^(-?)(\.)/,'\10\2').to_f.round 
end