对于赋值,我需要编写一个名为get_integer_from_string
的方法,它将输入字符串转换为整数。
我已经完成了它,但是有一个要求:
我可以在下面的代码中用char.to_i
替换哪些内容来满足此要求?
def get_integer_from_string(str, based=7)
return 0 if (/^(?<num>\d+)$/ =~ str).nil?
result = 0
str.reverse.each_char.with_index do |char, index|
tmp = char.to_i * based**index
result += tmp
end
result rescue 0
end
答案 0 :(得分:3)
我怀疑你是否过度思考这个问题。由于char
只能是十个不同字符串中的一个,因此只需将查找表作为哈希:
C_TO_I = {
"0" => 0, "1" => 1, "2" => 2, "3" => 3,
"4" => 4, "5" => 5, "6" => 6, "7" => 7,
"8" => 8, "9" => 9
}
然后只需用char.to_i
替换代码中的C_TO_I[char]
即可。为了证明:
char = "7"
p C_TO_I[char]
# => 7
答案 1 :(得分:1)
def my_to_i input, base
('0'...input).count.tap do |i|
raise ArgumentError, 'Incorrect value in input' if i >= base || i < 0
end
end
这里我们使用表示数字的字符随后定位的事实重新实现to_i
函数。 raise
子句负责无效输入,例如: G。基数为8
时7
。
答案 2 :(得分:1)
只是为了踢,这是你可以用另一种方式编写你的方法:
C_TO_I = (?0..?9).each_with_index.to_h
def s_to_i(str, base=7, mag=0)
return 0 if str.empty?
C_TO_I[str[-1]] * base ** mag +
s_to_i(str[0...-1], base, mag + 1)
end
str = "654"
p s_to_i(str) # => 333
当然,上面的C_TO_I
哈希只适用于10和10以下。你可以用这样的东西一直到36基地:
C_TO_I = [ *?0..?9, *?a..?z ].each_with_index.to_h