使用Ruby将数字转换为单词?

hke*_*n27 12 ruby numbers ruby-on-rails

如何将数字转换为红宝石中的单词?

我知道某处有一块宝石.试图在没有宝石的情况下实现它.我只需要用英语单词的数字来表示整数.发现这个,但它非常混乱.如果您对如何实现更清晰易读的解决方案有任何想法,请分享.

http://raveendran.wordpress.com/2009/05/29/ruby-convert-number-to-english-word/

这是我一直在努力的方面.但在实施量表时遇到一些问题.代码仍然是一团糟.我希望它在正常运行时更具可读性.

   class Numberswords
    def in_words(n)

    words_hash = {0=>"zero",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"}

     scale = [000=>"",1000=>"thousand",1000000=>" million",1000000000=>" billion",1000000000000=>" trillion", 1000000000000000=>" quadrillion"]


    if words_hash.has_key?(n) 
      words_hash[n]

      #still working on this middle part. Anything above 999 will not work
     elsif n>= 1000  
     print  n.to_s.scan(/.{1,3}/) do |number|
            print number
      end



      #print value = n.to_s.reverse.scan(/.{1,3}/).inject([]) { |first_part,second_part| first_part << (second_part == "000" ? "" : second_part.reverse.to_i.in_words) }
      #(value.each_with_index.map { |first_part,second_part| first_part == "" ? "" : first_part + scale[second_part] }-[""]).reverse.join(" ")

    elsif n <= 99
       return [words_hash[n - n%10],words_hash[n%10]].join(" ")
    else
      words_hash.merge!({ 100=>"hundred" })
      ([(n%100 < 20 ? n%100 : n.to_s[2].to_i), n.to_s[1].to_i*10, 100, n.to_s[0].to_i]-[0]-[10])
        .reverse.map { |num| words_hash[num] }.join(" ")
    end
  end
end

#test code
test = Numberswords.new
 print test.in_words(200)
Run Code Online (Sandbox Code Playgroud)

NoN*_*nse 17

我对此有所了解

def in_words(int)
  numbers_to_name = {
      1000000 => "million",
      1000 => "thousand",
      100 => "hundred",
      90 => "ninety",
      80 => "eighty",
      70 => "seventy",
      60 => "sixty",
      50 => "fifty",
      40 => "forty",
      30 => "thirty",
      20 => "twenty",
      19=>"nineteen",
      18=>"eighteen",
      17=>"seventeen", 
      16=>"sixteen",
      15=>"fifteen",
      14=>"fourteen",
      13=>"thirteen",              
      12=>"twelve",
      11 => "eleven",
      10 => "ten",
      9 => "nine",
      8 => "eight",
      7 => "seven",
      6 => "six",
      5 => "five",
      4 => "four",
      3 => "three",
      2 => "two",
      1 => "one"
    }
  str = ""
  numbers_to_name.each do |num, name|
    if int == 0
      return str
    elsif int.to_s.length == 1 && int/num > 0
      return str + "#{name}"      
    elsif int < 100 && int/num > 0
      return str + "#{name}" if int%num == 0
      return str + "#{name} " + in_words(int%num)
    elsif int/num > 0
      return str + in_words(int/num) + " #{name} " + in_words(int%num)
    end
  end
end



puts in_words(4) == "four"
puts in_words(27) == "twenty seven"
puts in_words(102) == "one hundred two"
puts in_words(38_079) == "thirty eight thousand seventy nine"
puts in_words(82102713) == "eighty two million one hundred two thousand seven hundred thirteen"
Run Code Online (Sandbox Code Playgroud)

  • 非常好@NoNonsene!我会在以'+ in_words(int%/ num)'结尾的两行中添加一个(...).strip,以避免在int = 900等情况下使用尾随空格 (2认同)

rhe*_*ndo 11

你认为'人性化'吗?

https://github.com/radar/humanize


Dee*_*ale 8

简单的答案使用humanizegem,您将获得所需的输出

直接安装

gem install humanize
Run Code Online (Sandbox Code Playgroud)

或者将它添加到你的 Gemfile

gem 'humanize'
Run Code Online (Sandbox Code Playgroud)

你可以使用它

require 'humanize'

1.humanize       #=> 'one'
345.humanize     #=> 'three hundred and forty-five'
1723323.humanize #=> 'one million, seven hundred and twenty-three thousand, three hundred and twenty-three'
Run Code Online (Sandbox Code Playgroud)

如果你在 Rails 中使用它,你可以直接使用它

注意:正如sren在下面的评论中所提到的。提供的人性化方法ActiveSupport与 gem 不同humanize

  • 不要与 ActiveSupport 的 `humanize` 混淆,这是一个单独的 gem。https://github.com/radar/humanize (4认同)

小智 6

您还可以使用to_words gem.

这个宝石将整数转换成单词.

例如

1.to_words # one ,

100.to_words # one hundred ,

101.to_words # one hundred and one
Run Code Online (Sandbox Code Playgroud)

它还转换负数.


Ric*_*eck 1

我可以看到您在寻找什么,您可能希望查看此 StackOverflow 帖子:数字到英语单词转换 Rails

总结如下:

不行,你必须自己写一个函数。最接近您想要的是 number_to_ human,但这不会将 1 转换为 1。

以下是一些可能有用的 URL:

http://codesnippets.joyent.com/posts/show/447 http://raveendran.wordpress.com/2009/05/29/ruby-convert-number-to-english-word/ http://deveiate.org /项目/语言学/