Как реализовать метод atof (ascii to float) в ruby?

Я пытаюсь сделать калькулятор RPN. Я должен реализовать свой собственный метод .to_i и .to_f. Я не могу использовать методы send, eval, Float(str) или String(str). Задание выполнено, но я все еще хочу знать, как его реализовать.

Ввод: atof(255.25) как строковый тип
Вывод: 255.55 как тип float

Вот мой код для atoi

ASCII_NUM_START = 48 # начало ASCII-кода для 0

определение ascii_to_i(int_as_str)

array_ascii = int_as_str.bytes
convert_arr = array_ascii.map {|ascii| ascii - ASCII_NUM_START }
convert_arr.inject { |sum, n| сумма * 10 + n }
конец

определение ascii_to_f(float_as_str)
???
конец


person the_answer_is_xyz    schedule 04.07.2014    source источник
comment
Я бы предположил ASCII_NUM_START = '0'.ord (48)? И что вы имеете в виду Output: 255.25 из вашего примера?   -  person Neil Slater    schedule 05.07.2014
comment
да вы правы. я обновил задание.   -  person the_answer_is_xyz    schedule 05.07.2014
comment
привет @ akh88 мой ответ сработал для тебя?   -  person Anthony    schedule 09.07.2014


Ответы (2)


Я заставил его работать, делая следующее (и используя вашу функцию ascii_to_i).

ASCII_NUM_START = 48 # start of ascii code for 0 


def ascii_to_i(int_as_str) 

  array_ascii = int_as_str.bytes 
  converted_arr = array_ascii.map {|ascii| ascii - ASCII_NUM_START } 
  converted_arr.inject { |sum, n| sum * 10 + n } 
end 

def ascii_to_f(float_as_str) 
  int_split = float_as_str.split(".")
  results = []
  int_split.each { |val| results << ascii_to_i(val) }
  results[0] + (results[1] / (10.0 ** int_split.last.length))
end
person Anthony    schedule 05.07.2014

Я вижу, что вы приложили разумные усилия к ascii_to_i.

Код для ascii_to_f может быть аналогичным, и дополнительно вам нужно будет разделить результат на количество обработанных вами знаков после запятой.

Вероятно, самая простая адаптация:

  • найдите позицию символа . (код ASCII 46) в String, сохраните ее как переменную
  • удалите символ . (код ASCII 46) из вашего массива байтов
  • вычислить целочисленное значение из массива байтов, как и раньше
  • разделите на 10.0 (должно быть Float) в степени (длина оставшегося массива минус позиция, в которой вы нашли .).

Я не даю код, потому что это задание. Посмотрите, сможете ли вы понять правильный синтаксис, просмотрев документацию для класса Array, чтобы найти положение определенного значения, удалить определенное значение и получить длину массива.

person Neil Slater    schedule 05.07.2014
comment
спасибо, это помогает. Я не успел сдать его к заданию, но мне хотелось научиться это делать. Я думаю . разделение полезно. Я попробую ваш псевдокод! - person the_answer_is_xyz; 07.07.2014