fauxparse / numb3rs

Rails plugin for converting numbers to (English) words

This URL has Read+Write access

fauxparse (author)
Sat Aug 08 20:22:49 -0700 2009
commit  0a44734c92383d76fd51005f8a5a8d4826c22cac
tree    f42cd89083273fae2183392f26839b26ce7dc6f2
parent  794f92996c313d49d1cca07ebb71c040cb17fdd0
numb3rs / lib / numb3rs / languages / en_uk.rb
100644 64 lines (61 sloc) 1.996 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
module Numb3rs
  module Languages
    class EnUk
      def initialize
        @cached = {
          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",
          100 => "a hundred",
          1_000 => "a thousand",
          1_000_000 => "a million",
          1_000_000_000 => "a billion",
          1_000_000_000_000 => "a trillion",
        }
      end
      
      def in_words(number, *args)
        return "minus " + in_words(-number) if number < 0
        @cached[number] || returning("") do |s|
          s << case number
          when 0..99 then ([ in_words(number - number % 10), in_words(number % 10) ] - %w(zero)).join("-")
          when 100..999 then partial_words(number, 100)
          when 1_000..999_999 then partial_words(number, 1000)
          when 1_000_000..999_999_999 then partial_words(number, 1_000_000)
          else "many"
          end
          s.sub! /^one /, "a " unless number > 1_000_000 and number % 1_000_000 > 100
          @cached[number] = s if number < 1000 and @cached[number].nil?
        end
      end
 
    protected
      def partial_words(number, magnitude)
        ([ in_words(number / magnitude) + " " + in_words(magnitude).sub(/^a(n)? /, ""), in_words(number % magnitude) ] - %w(zero)).join(number % magnitude < 100 ? " and " : ", ")
      end
    end
  end
end