如何使用哈希多个键生成值为ruby的组合字符串

Mat*_*att 3 ruby

所以我在下面有这个哈希:

   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 

    } 
Run Code Online (Sandbox Code Playgroud)

可以说我的字符串输入是"99100".让我们说我希望我的字符串输出是"九十一百".如何在不键入每个键/值的情况下使用上面的哈希值.我想也许可以将每个字符串中的字符串拆分成一个数组....然后对于该数组中的每个数字都返回我的值?还有其他任何我应该考虑的策略吗?这是我到目前为止:

  puts "test the hash! Type a number hit enter"
  test_variable = gets.to_s.chomp
  puts a_hash[test_variable]
Run Code Online (Sandbox Code Playgroud)

发布一些代码,以便我可以试试.谢谢!

Jon*_*röm 7

如果您只是想要一个解决方案而不是算法来使用您的哈希值,那么Ruby Linguistics可以提供服务

require 'linguistics'
include Linguistics::EN
numwords(99100)
Run Code Online (Sandbox Code Playgroud)

=>"九十九,一百"


mol*_*olf 7

简短的回答:不要自己这样做,找一个能为你做这件事图书馆.

然而,它可能是一个很酷的运动,它实际上是一个有趣的问题.因此,忽略了不重新发明轮子的最佳实践......你可能不得不以不同的方式对待数百和数千,因为你可以说"二百",但"二十七"并没有多大意义.

这是我经过严格测试,未经优化的尝试.这是一个概念验证,我很确定我忽略了很多案例.如果您需要更多帮助,请尝试阅读其他人的源代码.

首先,我们定义两个哈希值,一个用于数字,一个用于量值(这是不同的,因为它们可以用数字作为前缀以便将它们相乘).

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
Run Code Online (Sandbox Code Playgroud)

接下来,定义转换方法.

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
Run Code Online (Sandbox Code Playgroud)

要使用它:

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"
Run Code Online (Sandbox Code Playgroud)