Does anyone know if there is a function available which can format any entered number as words? eg: ''1234'' would be ''One Thousand Two Hundred and Thirty Four'' In the past, I would have said this is a tall order, but from what I''ve seen with playing with rails for a short time, I don''t know what to expect. :) Thanks for any help, Damien -- Posted via http://www.ruby-forum.com/.
Does this do the trick? You can uncomment the commented lines at the end and run the script to see if it works. Improvements and better ways to do this are appreciated ... -- G. class Number def self.to_words(number) Number.new.to_s(number) end def self.commify(number) (s=number.to_s;x=s.length;s).rjust(x+(3-(x%3))).gsub(/(\d)(?=\d{3}+(\.\d*)?$)/, ''\1,'') end def initialize @unit = %w[zero one two three four five six seven eight nine] @teen = %w[ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen] @tens = %w[zero ten twenty thirty fourty fifty sixty seventy eighty ninety] @qtys = %w[hundred thousand million billion trillion quadrillion quintillion] @zero = ["zero"] @hundred = "hundred" @sepr = "and" end def to_s(number) out = quantify(number).flatten for x in 0 .. out.length - 1 out[x] = nil if out[x] == @sepr && out[x+1] == @sepr out[x] = nil if out[x] == "," && out[x+1] == "," end out.compact! out = @zero if out.length == 1 && out[0] == @sepr out.pop while out.last == @sepr out.shift while out.first == @sepr out.join('' '').gsub(/ ,/,'','') end private def padded_groups(v) out = [] padded = (s=v.to_s;x=s.length;s).rjust(x+(3-(x%3))).gsub(/ /,''0'') padded.scan(/.{3}/) end def wordify(v) out = [] zero = ''0''[0] h, t, u = v[0] - zero, v[1] - zero, v[2] - zero if h != 0 out << @unit[h] out << @hundred end out << @sepr if h != 0 && (t != 0 || u != 0) out << @sepr if h == 0 && t == 0 && u != 0 if t == 1 out << @teen[u] else out << @tens[t] if t != 0 out << @unit[u] if u != 0 end return out end def quantify(v) v = padded_groups(v).reverse cur = pos = v.length - 1 out = [] while pos >= 0 if v[pos] == '','' out << '','' next end word = wordify(v[pos]) if word[0] != nil out << word out << @qtys[cur] if cur != 0 else out << @sepr end cur -= 1 pos -= 1 end return out end end # for number in [ # 0, # 1, # 3, # 11, # 100, # 1000, # 1001, # 1100, # 1101, # 1_000_001, # 8_000_000_000, # 8_000_000_001, # 4_567_890_923, # 6_804_567_890_903, # 5_006_804_567_890_903 # ] # print "#{Number.commify(number)}: #{Number.to_words(number)}\n" # end On 4/30/06, Damien Timewell <mail@damientimewell.com> wrote:> Does anyone know if there is a function available which can format any > entered number as words? > > eg: ''1234'' would be ''One Thousand Two Hundred and Thirty Four'' > > In the past, I would have said this is a tall order, but from what I''ve > seen with playing with rails for a short time, I don''t know what to > expect. :) > > Thanks for any help, > Damien > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
Damien Timewell wrote:> Does anyone know if there is a function available which can format any > entered number as words? > > eg: ''1234'' would be ''One Thousand Two Hundred and Thirty Four'' > > In the past, I would have said this is a tall order, but from what I''ve > seen with playing with rails for a short time, I don''t know what to > expect. :) > > Thanks for any help, > Damienhttp://www.rubyquiz.com/quiz25.html j`ey http://www.eachmapinject.com -- Posted via http://www.ruby-forum.com/.
joey__ wrote:> Damien Timewell wrote: >> Does anyone know if there is a function available which can format any >> entered number as words? >> >> eg: ''1234'' would be ''One Thousand Two Hundred and Thirty Four'' >> >> In the past, I would have said this is a tall order, but from what I''ve >> seen with playing with rails for a short time, I don''t know what to >> expect. :) >> >> Thanks for any help, >> Damien > http://www.rubyquiz.com/quiz25.html > > j`ey > http://www.eachmapinject.comThanks, that looks perfect, but i''m really confused as to how I implement it.. it doesnt explain on that page how to actually use it?? Sorry, i''m a real noob with rails. -- Posted via http://www.ruby-forum.com/.
Place the code into a file called number.rb ... you can put it in your models directory for example. If it is in your models directory, then you don''t even need to require ''number'' - all you do is make a call to Number.to_words and pass the amount as a parameter ... insight$ ls number.rb insight$ irb irb(main):001:0> require ''number'' => true irb(main):002:0> Number.to_words 345678 => "three hundred and fourty five thousand six hundred and seventy eight" irb(main):003:0> exit insight$
Damien Timewell wrote:> joey__ wrote: >> Damien Timewell wrote: >>> Does anyone know if there is a function available which can format any >>> entered number as words? >>> >>> eg: ''1234'' would be ''One Thousand Two Hundred and Thirty Four'' >>> >>> In the past, I would have said this is a tall order, but from what I''ve >>> seen with playing with rails for a short time, I don''t know what to >>> expect. :) >>> >>> Thanks for any help, >>> Damien >> http://www.rubyquiz.com/quiz25.html >> >> j`ey >> http://www.eachmapinject.com > > Thanks, that looks perfect, but i''m really confused as to how I > implement it.. it doesnt explain on that page how to actually use it?? > > Sorry, i''m a real noob with rails.Add the code from: http://www.ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-talk/135735 Into a english_numbers.rb in the lib/ folder. Then do require ''lib/english_numbers.rb'' Then do EnglishNumerals.to_English(number) j`ey http://eachmapinject.com -- Posted via http://www.ruby-forum.com/.
>> >> Thanks, that looks perfect, but i''m really confused as to how I >> implement it.. it doesnt explain on that page how to actually use it?? >> >> Sorry, i''m a real noob with rails. > > Add the code from: > http://www.ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-talk/135735 > > Into a english_numbers.rb in the lib/ folder. Then do require > ''lib/english_numbers.rb'' > > > Then do EnglishNumerals.to_English(number) > > j`ey > http://eachmapinject.comThanks for the help, but i''m still quite confused. I did as you said, made the file in lib but I wasn''t too sure where to put the require so I''ve tried everything - in the model, helper and controller. Wherever I put it, it returned an error, but when it was in the controller, rather than saying it couldn''t find the file or something to that effect, it said "wrong number of arguments (0 for 1)" -- Posted via http://www.ruby-forum.com/.
thanks, Guido Sohne, that did the trick. when I tried it with the previous code from j`ey, it killed my server and I had to reboot, but with that new script, it''s perfect. thanks again. -- Posted via http://www.ruby-forum.com/.
Just the job!!! thats a great class Cheers Tim -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---