Как использовать хеш-ключи для генерации комбинированной строки значений ruby - PullRequest
3 голосов
/ 19 ноября 2010

Итак, у меня есть этот хэш ниже:

   a_hash = {
    "1" => "one",
    "2" => "two",
    "3" => "three",
    "4" => "four",
    "5" => "five",
    "6" => "six",
    "7" => "seven",
    "8" => "eight",
    "9" => "nine",
    "10" => "ten",
    "11" => "eleven",
    "12" => "twelve",
    "13" => "thirteen",
    "14" => "fourteen",
    "15" => "fifteen",
    "16" => "sixteen",
    "17" => "seventeen",
    "18" => "eighteen",
    "19" => "nineteen",
    "20" => "twenty",
    "30" => "thirty",
    "40" => "forty",
    "50" => "fifty",
    "60" => "sixty",
    "70" => "seventy",
    "80" => "eighty",
    "90" => "ninety",
    "00" => "hundred", #not sure this is right 
    "000" => "thousand"  #not sure this is right 

    } 

Допустим, мой строковый ввод - "99100". Допустим, я хочу, чтобы мой вывод был «девяносто девять тысяч сто». Как мне использовать мой хеш, не вводя каждый ключ / значение? Я думал, может быть, разделить мою строку на каждый символ в массиве .... тогда для каждого числа в этом массиве вернуть мое значение? Любые другие стратегии, которые я должен рассмотреть? Это то, что я до сих пор:

  puts "test the hash! Type a number hit enter"
  test_variable = gets.to_s.chomp
  puts a_hash[test_variable]

Опубликуйте код, чтобы я мог попробовать. Спасибо!

Ответы [ 2 ]

7 голосов
/ 19 ноября 2010

Краткий ответ: не делайте этого сами , найдите библиотеку , которая сделает это за вас.

Однако, это может быть крутоупражнение и это на самом деле интересная проблема.Итак, игнорируя лучшие практики не изобретать велосипед ... Вам, вероятно, придется относиться к сотням и тысячам по-разному, потому что вы можете сказать «двести», но «два семидесяти» на самом деле не имеет особого смысла.

Вот моя плохо проверенная, неоптимизированная попытка.Это доказательство концепции , и я почти уверен, что пропустил многие случаи.Если вам нужна дополнительная помощь, попробуйте прочитать исходный код .

других людей. Сначала мы определяем два хэша, один для чисел, другой для величин (которые различаются, поскольку перед ними могут стоять префиксы с числами вчтобы умножить их).

class Integer
  NUMBERS = {
    1 => "one",
    2 => "two",
    3 => "three",
    4 => "four",
    5 => "five",
    6 => "six",
    7 => "seven",
    8 => "eight",
    9 => "nine",
    10 => "ten",
    11 => "eleven",
    12 => "twelve",
    13 => "thirteen",
    14 => "fourteen",
    15 => "fifteen",
    16 => "sixteen",
    17 => "seventeen",
    18 => "eighteen",
    19 => "nineteen",
    20 => "twenty",
    30 => "thirty",
    40 => "forty",
    50 => "fifty",
    60 => "sixty",
    70 => "seventy",
    80 => "eighty",
    90 => "ninety"
  }

  MAGNITUDES = {
    100 => "hundred",
    1000 => "thousand",
    1000_000 => "million"
  }
end

Далее определите метод преобразования.

class Integer
  def to_text
    return nil if self == 0
    if NUMBERS.keys.include? self
      NUMBERS[self]
    elsif self < MAGNITUDES.keys.first
      base = maximum_fitting(NUMBERS, self)
      [NUMBERS[base], (self - base).to_text].compact * "-"
    else
      base = maximum_fitting(MAGNITUDES, self)
      quo, mod = self.divmod(base)
      [quo.to_text, MAGNITUDES[base], mod.to_text].compact * " "
    end
  end

  private

  def maximum_fitting(list, number)
    list.keys.select { |n| n <= number }.last
  end
end

Чтобы использовать его:

puts 2351.to_text
#=> "two thousand three hundred fifty-one"

puts 14330132.to_text
#=> "fourteen million three hundred thirty thousand one hundred thirty-two"

puts 1000000.to_text
#=> "one million"
7 голосов
/ 19 ноября 2010

Если вам просто нужно решение, а не алгоритм использования вашего хэша, тогда Ruby Linguistics может быть полезным

require 'linguistics'
include Linguistics::EN
numwords(99100)

=> "девяносто девять тысяч сто

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...