我可以用什么代替char.to_i?

时间:2016-07-11 04:58:28

标签: ruby

对于赋值,我需要编写一个名为get_integer_from_string的方法,它将输入字符串转换为整数。 我已经完成了它,但是有一个要求:

  • 请不要使用隐式或自动类型转换来解决此问题 问题,即C中的atoi(),Python中的int(),像parseInt()这样的函数 在Java或PHP中的intval()

我可以在下面的代码中用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

3 个答案:

答案 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。基数为87

答案 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