polish-number 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README.rdoc +3 -0
  2. data/lib/polish_number.rb +54 -144
  3. metadata +9 -4
@@ -1,6 +1,9 @@
1
1
  = polish-number
2
2
  Translates numbers to Polish words
3
3
 
4
+ = Installation
5
+ gem install polish-number
6
+
4
7
  = Usage
5
8
  require 'polish_number'
6
9
 
@@ -1,170 +1,80 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module PolishNumber
4
- TRANSLATIONS = {
5
- 0 => 'zero',
6
- 1 => 'jeden',
7
- 2 => 'dwa',
8
- 3 => 'trzy',
9
- 4 => 'cztery',
10
- 5 => 'pięć',
11
- 7 => 'siedem',
12
- 6 => 'sześć',
13
- 8 => 'osiem',
14
- 9 => 'dziewięć',
15
- 10 => 'dziesięć',
16
- 11 => 'jedenaście',
17
- 12 => 'dwanaście',
18
- 13 => 'trzynaście',
19
- 14 => 'czternaście',
20
- 15 => 'piętnaście',
21
- 16 => 'szesnaście',
22
- 17 => 'siedemnaście',
23
- 18 => 'osiemnaście',
24
- 19 => 'dziewiętnaście',
25
- 20 => 'dwadzieścia',
26
- 30 => 'trzydzieści',
27
- 40 => 'czterdzieści',
28
- 50 => 'pięćdziesiąt',
29
- 60 => 'sześćdziesiąt',
30
- 70 => 'siedemdziesiąt',
31
- 80 => 'osiemdziesiąt',
32
- 90 => 'dziewięćdziesiąt',
33
- 100 => 'sto',
34
- 200 => 'dwieście',
35
- 300 => 'trzysta',
36
- 400 => 'czterysta',
37
- 500 => 'pięćset',
38
- 600 => 'sześćset',
39
- 700 => 'siedemset',
40
- 800 => 'osiemset',
41
- 900 => 'dziewięćset',
42
- 1000 => 'tysiąc'
43
- }.freeze
44
-
45
- def self.rehash(hash)
46
- result = Hash.new(hash['5'])
47
- result[0] = hash['5']
48
- result[1] = hash['1']
49
- result[2] = result[3] = result[4] = hash['2_3_4']
50
- end
51
-
52
- THOUSANDS = rehash({
53
- '1' => 'tysiąc',
54
- '2_3_4' => 'tysiące', # 22..24, 32..34
55
- '5' => 'tysięcy', # 0, 5..21, 25..31
56
- })
57
-
58
- def self.translate_0_19(number)
59
- TRANSLATIONS[number]
60
- end
61
-
62
- def self.translate_20_99(number)
63
- return TRANSLATIONS[number] if TRANSLATIONS.has_key? number
64
-
65
- first, second = number.to_s.split(//).map { |c| c.to_i }
66
- "#{TRANSLATIONS[first*10]} #{TRANSLATIONS[second]}"
67
- end
4
+ HUNDREDS = ['', 'sto ', 'dwieście ', 'trzysta ', 'czterysta ', 'pięćset ', 'sześćset ',
5
+ 'siedemset ', 'osiemset ', 'dziewięćset ']
68
6
 
69
- def self.translate_0_99(number)
70
- number < 20 ? translate_0_19(number) : translate_20_99(number)
71
- end
7
+ TENS = ['', 'dziesięć ', 'dwadzieścia ', 'trzydzieści ', 'czterdzieści ', 'pięćdziesiąt ',
8
+ 'sześćdziesiąt ', 'siedemdziesiąt ', 'osiemdziesiąt ', 'dziewięćdziesiąt ']
72
9
 
73
- def self.translate_100_999(number)
74
- return TRANSLATIONS[number] if TRANSLATIONS.has_key? number
10
+ TEENS = ['', 'jedenaście ', 'dwanaście ', 'trzynaście ', 'czternaście ', 'piętnaście ',
11
+ 'szesnaście ', 'siedemnaście ', 'osiemnaście ', 'dziewiętnaście ']
75
12
 
76
- hundreds = number/100
77
- translations = []
78
- translations << TRANSLATIONS[hundreds*100]
13
+ UNITIES = ['', 'jeden ', 'dwa ', 'trzy ', 'cztery ', 'pięć ', 'sześć ', 'siedem ', 'osiem ',
14
+ 'dziewięć ']
79
15
 
80
- tens_units = number%100
81
- if tens_units > 0
82
- translations << translate_0_99(tens_units)
83
- end
16
+ ZERO = 'zero'
84
17
 
85
- translations.join(' ')
86
- end
18
+ THOUSANDS = ['', 'tysiąc ', 'tysiące ', 'tysięcy ']
87
19
 
88
- def self.translate_0_999(number)
89
- number < 100 ? translate_0_99(number) : translate_100_999(number)
90
- end
20
+ AND = 'i '
21
+ DECIMALS = ['', 'dziesiąta ', 'dziesiąte ', 'dziesiątych ']
91
22
 
92
- def self.translate_1000_9999(number)
93
- return TRANSLATIONS[number] if TRANSLATIONS.has_key? number
94
-
95
- translations = []
23
+ def self.translate(number)
24
+ number = number.to_f
96
25
 
97
- thousands = number/1000
98
- if thousands == 1
99
- translations << TRANSLATIONS[1000]
100
- else
101
- translations << "#{translate_100_999(number)} #{pluralize(thousands, THOUSANDS)}"
26
+ unless (0..999999.99).include? number
27
+ raise ArgumentError, 'number should be in 0..999999.99 range'
102
28
  end
103
29
 
104
- number %= 1000
105
- hundreds = number/100
106
- translations << translate_0_999(number)
107
-
108
- translations.join(' ')
109
- end
110
-
111
- def self.translate(number)
112
- number = number.to_i
113
- case number
114
- when 0..19
115
- return translate_0_19(number)
116
- when 20..99
117
- return translate_20_99(number)
118
- when 100..999
119
- return translate_100_999(number)
120
- when 1000..9999
121
- return translate_1000_9999(number)
30
+ return ZERO.dup if number == 0.0
31
+
32
+ formatted_number = sprintf("%09.2f", number)
33
+ digits = formatted_number.chars.map { |char| char.to_i }
34
+
35
+ result = ''
36
+ result << process_0_999(digits[0..2])
37
+ result << pluralize(digits[1..2], THOUSANDS)
38
+ result << process_0_999(digits[3..5])
39
+ # skip the 6th digit - it was a decimal dot
40
+ fraction = process_0_99(digits[7..8])
41
+ unless fraction == ''
42
+ result << AND
43
+ result << fraction
44
+ result << pluralize(digits[7..8], DECIMALS)
122
45
  end
46
+ result.strip!
47
+ result
123
48
  end
124
49
 
125
- def self.translate_3_digit_number(number)
126
- unless (0..999) === number
127
- raise "#{number} not supported"
128
- end
129
-
130
- # handle simple numbers
131
- if TRANSLATIONS.has_key? number
132
- return TRANSLATIONS[number]
133
- end
50
+ private
134
51
 
135
- number_digits = number.to_s.split(//)
52
+ def self.process_0_999(digits)
53
+ result = ''
54
+ result << HUNDREDS[digits[0]]
55
+ result << process_0_99(digits[1..2])
56
+ result
57
+ end
136
58
 
137
- last_2_digits =
138
- if number > 99
139
- number_digits[-2, 2]
59
+ def self.process_0_99(digits)
60
+ if digits[0] == 1 && digits[1] != 0
61
+ TEENS[digits[1]]
140
62
  else
141
- number_digits
63
+ TENS[digits[0]] + UNITIES[digits[1]]
142
64
  end
65
+ end
143
66
 
144
- last_2_digits = last_2_digits.join.to_i
145
- last_2_translation = TRANSLATIONS[last_2_digits]
146
-
147
- translation_digits = []
148
-
149
- if last_2_translation
150
- translation_digits.unshift last_2_digits
151
- number /= 100
152
- position = 2
67
+ def self.pluralize(digits, words)
68
+ if digits[0] == 0 && digits[1] == 0
69
+ thousand_id = 0
70
+ elsif digits[1] == 0 && digits[2] == 1
71
+ thousand_id = 1
72
+ elsif digits[1] != 1 && (2..4).include?(digits[2])
73
+ thousand_id = 2
153
74
  else
154
- position = 0
75
+ thousand_id = 3
155
76
  end
156
-
157
- while number != 0
158
- digit = number%10
159
- if digit > 0
160
- power = 10**position
161
- translation_digits.unshift digit*power
162
- end
163
- number /= 10
164
- position += 1
165
- end
166
-
167
- translation_digits
77
+ words[thousand_id]
168
78
  end
169
79
  end
170
80
 
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polish-number
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 27
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 1
9
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
10
11
  platform: ruby
11
12
  authors:
12
13
  - Wojciech Piekutowski
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-05-17 00:00:00 +02:00
18
+ date: 2010-06-10 00:00:00 +02:00
18
19
  default_executable:
19
20
  dependencies: []
20
21
 
@@ -47,23 +48,27 @@ rdoc_options:
47
48
  require_paths:
48
49
  - lib
49
50
  required_ruby_version: !ruby/object:Gem::Requirement
51
+ none: false
50
52
  requirements:
51
53
  - - ">="
52
54
  - !ruby/object:Gem::Version
55
+ hash: 3
53
56
  segments:
54
57
  - 0
55
58
  version: "0"
56
59
  required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
57
61
  requirements:
58
62
  - - ">="
59
63
  - !ruby/object:Gem::Version
64
+ hash: 3
60
65
  segments:
61
66
  - 0
62
67
  version: "0"
63
68
  requirements: []
64
69
 
65
70
  rubyforge_project: polish-number
66
- rubygems_version: 1.3.6
71
+ rubygems_version: 1.3.7
67
72
  signing_key:
68
73
  specification_version: 3
69
74
  summary: Translates numbers to Polish words