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)
简单的答案使用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
小智 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)
它还转换负数.
我可以看到您在寻找什么,您可能希望查看此 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 /项目/语言学/