2009-05-28 46 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