papla 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@papla
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in papla.gemspec
4
+ gemspec
@@ -0,0 +1,19 @@
1
+ # Papla
2
+
3
+ Papla is a Ruby gem that allows you to convert numbers into Polish words (e.g. `153` into `"sto pięćdziesiąt trzy"`), including the decimal part as cents and currency symbol. Its primary use case are invoices, where the total amount has to be displayed as words at the bottom line.
4
+
5
+ ## Basic examples
6
+
7
+ ```ruby
8
+ Papla[158] # => 'Sto pięćdziesiąt'
9
+ Papla[1_234] # => 'Tysiąc dwieście trzydzieści cztery'
10
+ Papla[987_654_321] # => 'Dziewięćset osiemdziesiąt siedem milionów sześćset pięćdziesiąt cztery tysiące trzysta dwadzieścia jeden'
11
+ ```
12
+
13
+ ## Cents and currency
14
+
15
+ This feature is planned for future releases.
16
+
17
+ ## Integration with Money, I18n and Rails
18
+
19
+ This feature is planned for future releases.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,107 @@
1
+ # encoding: utf-8
2
+ require "papla/version"
3
+
4
+ module Papla
5
+ def self.[](number)
6
+ validate!(number)
7
+ if number.zero?
8
+ ZERO
9
+ else
10
+ groups = group(number)
11
+ groups_as_words = convert_groups(groups)
12
+ groups_as_words.flatten.join(' ')
13
+ end.capitalize
14
+ end
15
+
16
+ private
17
+ ZERO = 'zero'
18
+
19
+ ONES = [nil] + %w[
20
+ jeden dwa trzy cztery pięć
21
+ sześć siedem osiem dziewięć dziesięć
22
+ jedenaście dwanaście trzynaście czternaście piętnaście
23
+ szesnaście siedemnaście osiemnaście dziewiętnaście
24
+ ].freeze
25
+
26
+ TENS = [nil, nil] + %w[
27
+ dwadzieścia trzydzieści czterdzieści pięćdziesiąt
28
+ sześćdziesiąt siedemdziesiąt osiemdziesiąt dziewięćdziesiąt
29
+ ].freeze
30
+
31
+ HUNDREDS = [nil] + %w[
32
+ sto dwieście trzysta czterysta pięćset
33
+ sześćset siedemset osiemset dziewięćset
34
+ ].freeze
35
+
36
+ RANKS = [
37
+ [],
38
+ ['tysięcy', 'tysiąc', 'tysiące'].freeze,
39
+ ['milionów', 'milion', 'miliony'].freeze,
40
+ ['miliardów', 'miliard', 'miliardy'].freeze
41
+ ].freeze
42
+
43
+ def self.group(number)
44
+ groups = []
45
+
46
+ while number > 0
47
+ number, group = number.divmod(1000)
48
+ groups.unshift(group)
49
+ end
50
+
51
+ groups
52
+ end
53
+
54
+ def self.convert_groups(groups)
55
+ bound = groups.count - 1
56
+ result = []
57
+
58
+ groups.each_with_index do |group, i|
59
+ if group > 0
60
+ result << convert_small_number(group)
61
+ result << rank(bound - i, group) if i < bound
62
+ end
63
+ end
64
+
65
+ result
66
+ end
67
+
68
+ def self.convert_small_number(number)
69
+ if number.zero?
70
+ []
71
+ elsif number < 20
72
+ [ONES[number]]
73
+ elsif number < 100
74
+ tens, remainder = number.divmod(10)
75
+ [TENS[tens], convert_small_number(remainder)]
76
+ else
77
+ hundreds, remainder = number.divmod(100)
78
+ [HUNDREDS[hundreds], convert_small_number(remainder)]
79
+ end
80
+ end
81
+
82
+ def self.rank(rank, number)
83
+ RANKS[rank][declination_index(number)]
84
+ end
85
+
86
+ def self.declination_index(number)
87
+ return 1 if number == 1
88
+
89
+ remainder = number - number / 100 * 100
90
+
91
+ case remainder
92
+ when 12..14 then 0
93
+ else
94
+ ones = number - number / 10 * 10
95
+
96
+ case ones
97
+ when 2..4 then 2
98
+ else 0
99
+ end
100
+ end
101
+ end
102
+
103
+ def self.validate!(number)
104
+ max = 999_999_999
105
+ raise ArgumentError, "#{number} is too big, only numbers up to #{max} are supported" if number > max
106
+ end
107
+ end
@@ -0,0 +1,3 @@
1
+ module Papla
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "papla/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "papla"
7
+ s.version = Papla::VERSION
8
+ s.authors = ["Olek Janiszewski"]
9
+ s.email = ["olek.janiszewski@gmail.com"]
10
+ s.homepage = "https://github.com/exviva/papla"
11
+ s.summary = %q{Use Ruby to convert numbers into Polish words}
12
+ s.description = %q{Papla is a Ruby gem that allows you to convert numbers into Polish words (e.g. 153 into "sto pięćdziesiąt trzy"), including the decimal part as cents and currency symbol. Its primary use case are invoices, where the total amount has to be displayed as words at the bottom line.}
13
+
14
+ s.rubyforge_project = "papla"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency 'rspec', '>= 2.8.0.rc2'
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
@@ -0,0 +1,216 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Papla do
5
+ it 'converts basic numbers' do
6
+ subject[0].should eq('Zero')
7
+ subject[1].should eq('Jeden')
8
+ subject[2].should eq('Dwa')
9
+ subject[3].should eq('Trzy')
10
+ subject[4].should eq('Cztery')
11
+ subject[5].should eq('Pięć')
12
+ subject[6].should eq('Sześć')
13
+ subject[7].should eq('Siedem')
14
+ subject[8].should eq('Osiem')
15
+ subject[9].should eq('Dziewięć')
16
+ subject[10].should eq('Dziesięć')
17
+ subject[11].should eq('Jedenaście')
18
+ subject[12].should eq('Dwanaście')
19
+ subject[13].should eq('Trzynaście')
20
+ subject[14].should eq('Czternaście')
21
+ subject[15].should eq('Piętnaście')
22
+ subject[16].should eq('Szesnaście')
23
+ subject[17].should eq('Siedemnaście')
24
+ subject[18].should eq('Osiemnaście')
25
+ subject[19].should eq('Dziewiętnaście')
26
+ end
27
+
28
+ it 'joins number of tens and ones' do
29
+ subject[20].should eq('Dwadzieścia')
30
+ subject[21].should eq('Dwadzieścia jeden')
31
+ subject[30].should eq('Trzydzieści')
32
+ subject[32].should eq('Trzydzieści dwa')
33
+ subject[40].should eq('Czterdzieści')
34
+ subject[43].should eq('Czterdzieści trzy')
35
+ subject[50].should eq('Pięćdziesiąt')
36
+ subject[54].should eq('Pięćdziesiąt cztery')
37
+ subject[60].should eq('Sześćdziesiąt')
38
+ subject[65].should eq('Sześćdziesiąt pięć')
39
+ subject[70].should eq('Siedemdziesiąt')
40
+ subject[76].should eq('Siedemdziesiąt sześć')
41
+ subject[80].should eq('Osiemdziesiąt')
42
+ subject[87].should eq('Osiemdziesiąt siedem')
43
+ subject[90].should eq('Dziewięćdziesiąt')
44
+ subject[98].should eq('Dziewięćdziesiąt osiem')
45
+ end
46
+
47
+ it 'joins number of hundreds, tens and ones' do
48
+ subject[100].should eq('Sto')
49
+ subject[101].should eq('Sto jeden')
50
+ subject[111].should eq('Sto jedenaście')
51
+ subject[122].should eq('Sto dwadzieścia dwa')
52
+
53
+ subject[200].should eq('Dwieście')
54
+ subject[202].should eq('Dwieście dwa')
55
+ subject[212].should eq('Dwieście dwanaście')
56
+ subject[233].should eq('Dwieście trzydzieści trzy')
57
+
58
+ subject[300].should eq('Trzysta')
59
+ subject[303].should eq('Trzysta trzy')
60
+ subject[313].should eq('Trzysta trzynaście')
61
+ subject[344].should eq('Trzysta czterdzieści cztery')
62
+
63
+ subject[400].should eq('Czterysta')
64
+ subject[404].should eq('Czterysta cztery')
65
+ subject[414].should eq('Czterysta czternaście')
66
+ subject[455].should eq('Czterysta pięćdziesiąt pięć')
67
+
68
+ subject[500].should eq('Pięćset')
69
+ subject[505].should eq('Pięćset pięć')
70
+ subject[515].should eq('Pięćset piętnaście')
71
+ subject[566].should eq('Pięćset sześćdziesiąt sześć')
72
+
73
+ subject[600].should eq('Sześćset')
74
+ subject[606].should eq('Sześćset sześć')
75
+ subject[616].should eq('Sześćset szesnaście')
76
+ subject[677].should eq('Sześćset siedemdziesiąt siedem')
77
+
78
+ subject[700].should eq('Siedemset')
79
+ subject[707].should eq('Siedemset siedem')
80
+ subject[717].should eq('Siedemset siedemnaście')
81
+ subject[788].should eq('Siedemset osiemdziesiąt osiem')
82
+
83
+ subject[800].should eq('Osiemset')
84
+ subject[808].should eq('Osiemset osiem')
85
+ subject[818].should eq('Osiemset osiemnaście')
86
+ subject[899].should eq('Osiemset dziewięćdziesiąt dziewięć')
87
+
88
+ subject[900].should eq('Dziewięćset')
89
+ subject[909].should eq('Dziewięćset dziewięć')
90
+ subject[919].should eq('Dziewięćset dziewiętnaście')
91
+ subject[990].should eq('Dziewięćset dziewięćdziesiąt')
92
+ end
93
+
94
+ it 'supports thousands' do
95
+ subject[1000].should eq('Jeden tysiąc')
96
+ subject[1001].should eq('Jeden tysiąc jeden')
97
+ subject[1234].should eq('Jeden tysiąc dwieście trzydzieści cztery')
98
+ subject[1999].should eq('Jeden tysiąc dziewięćset dziewięćdziesiąt dziewięć')
99
+
100
+ subject[2000].should eq('Dwa tysiące')
101
+ subject[2001].should eq('Dwa tysiące jeden')
102
+ subject[2345].should eq('Dwa tysiące trzysta czterdzieści pięć')
103
+ subject[2888].should eq('Dwa tysiące osiemset osiemdziesiąt osiem')
104
+
105
+ subject[3000].should eq('Trzy tysiące')
106
+ subject[4000].should eq('Cztery tysiące')
107
+ subject[5000].should eq('Pięć tysięcy')
108
+ subject[6000].should eq('Sześć tysięcy')
109
+ subject[7000].should eq('Siedem tysięcy')
110
+ subject[8000].should eq('Osiem tysięcy')
111
+ subject[9000].should eq('Dziewięć tysięcy')
112
+ end
113
+
114
+ it 'supports tens of thousands' do
115
+ subject[10000].should eq('Dziesięć tysięcy')
116
+
117
+ subject[11000].should eq('Jedenaście tysięcy')
118
+ subject[12000].should eq('Dwanaście tysięcy')
119
+ subject[13000].should eq('Trzynaście tysięcy')
120
+ subject[14000].should eq('Czternaście tysięcy')
121
+ subject[15000].should eq('Piętnaście tysięcy')
122
+ subject[16000].should eq('Szesnaście tysięcy')
123
+ subject[17000].should eq('Siedemnaście tysięcy')
124
+ subject[18000].should eq('Osiemnaście tysięcy')
125
+ subject[19000].should eq('Dziewiętnaście tysięcy')
126
+ subject[20000].should eq('Dwadzieścia tysięcy')
127
+
128
+ subject[21000].should eq('Dwadzieścia jeden tysięcy')
129
+ subject[22000].should eq('Dwadzieścia dwa tysiące')
130
+ subject[23000].should eq('Dwadzieścia trzy tysiące')
131
+ subject[24000].should eq('Dwadzieścia cztery tysiące')
132
+ subject[25000].should eq('Dwadzieścia pięć tysięcy')
133
+ subject[26000].should eq('Dwadzieścia sześć tysięcy')
134
+ subject[27000].should eq('Dwadzieścia siedem tysięcy')
135
+ subject[28000].should eq('Dwadzieścia osiem tysięcy')
136
+ subject[29000].should eq('Dwadzieścia dziewięć tysięcy')
137
+
138
+ subject[33000].should eq('Trzydzieści trzy tysiące')
139
+ subject[44000].should eq('Czterdzieści cztery tysiące')
140
+ subject[55000].should eq('Pięćdziesiąt pięć tysięcy')
141
+ subject[66000].should eq('Sześćdziesiąt sześć tysięcy')
142
+ subject[77000].should eq('Siedemdziesiąt siedem tysięcy')
143
+ subject[88000].should eq('Osiemdziesiąt osiem tysięcy')
144
+ subject[99000].should eq('Dziewięćdziesiąt dziewięć tysięcy')
145
+ end
146
+
147
+ it 'supports hundreds of thousands' do
148
+ subject[100_000].should eq('Sto tysięcy')
149
+
150
+ subject[101_000].should eq('Sto jeden tysięcy')
151
+ subject[102_000].should eq('Sto dwa tysiące')
152
+ subject[103_000].should eq('Sto trzy tysiące')
153
+ subject[104_000].should eq('Sto cztery tysiące')
154
+ subject[105_000].should eq('Sto pięć tysięcy')
155
+ subject[111_000].should eq('Sto jedenaście tysięcy')
156
+ subject[112_000].should eq('Sto dwanaście tysięcy')
157
+ subject[113_000].should eq('Sto trzynaście tysięcy')
158
+ subject[222_000].should eq('Dwieście dwadzieścia dwa tysiące')
159
+ subject[333_000].should eq('Trzysta trzydzieści trzy tysiące')
160
+ subject[444_000].should eq('Czterysta czterdzieści cztery tysiące')
161
+ subject[555_000].should eq('Pięćset pięćdziesiąt pięć tysięcy')
162
+ subject[666_000].should eq('Sześćset sześćdziesiąt sześć tysięcy')
163
+ subject[777_000].should eq('Siedemset siedemdziesiąt siedem tysięcy')
164
+ subject[999_000].should eq('Dziewięćset dziewięćdziesiąt dziewięć tysięcy')
165
+ subject[999_999].should eq('Dziewięćset dziewięćdziesiąt dziewięć tysięcy dziewięćset dziewięćdziesiąt dziewięć')
166
+ end
167
+
168
+ it 'supports millions' do
169
+ subject[1_000_000].should eq('Jeden milion')
170
+ subject[1_000_001].should eq('Jeden milion jeden')
171
+ subject[1_001_001].should eq('Jeden milion jeden tysiąc jeden')
172
+ subject[1_234_567].should eq('Jeden milion dwieście trzydzieści cztery tysiące pięćset sześćdziesiąt siedem')
173
+ subject[2_000_000].should eq('Dwa miliony')
174
+ subject[3_303_303].should eq('Trzy miliony trzysta trzy tysiące trzysta trzy')
175
+ subject[4_004_000].should eq('Cztery miliony cztery tysiące')
176
+ subject[5_500_000].should eq('Pięć milionów pięćset tysięcy')
177
+ subject[6_000_000].should eq('Sześć milionów')
178
+ subject[7_000_000].should eq('Siedem milionów')
179
+ subject[9_000_000].should eq('Dziewięć milionów')
180
+ end
181
+
182
+ it 'supports tens of millions' do
183
+ subject[11_000_000].should eq('Jedenaście milionów')
184
+ subject[13_000_000].should eq('Trzynaście milionów')
185
+ subject[15_000_000].should eq('Piętnaście milionów')
186
+ subject[19_000_000].should eq('Dziewiętnaście milionów')
187
+ subject[20_000_000].should eq('Dwadzieścia milionów')
188
+ subject[22_000_000].should eq('Dwadzieścia dwa miliony')
189
+ subject[33_000_000].should eq('Trzydzieści trzy miliony')
190
+ subject[44_000_000].should eq('Czterdzieści cztery miliony')
191
+ subject[55_000_000].should eq('Pięćdziesiąt pięć milionów')
192
+ subject[66_000_000].should eq('Sześćdziesiąt sześć milionów')
193
+ subject[77_000_000].should eq('Siedemdziesiąt siedem milionów')
194
+ subject[88_000_000].should eq('Osiemdziesiąt osiem milionów')
195
+ subject[99_000_000].should eq('Dziewięćdziesiąt dziewięć milionów')
196
+ subject[99_999_999].should eq('Dziewięćdziesiąt dziewięć milionów dziewięćset dziewięćdziesiąt dziewięć tysięcy dziewięćset dziewięćdziesiąt dziewięć')
197
+ end
198
+
199
+ it 'supports hundreds of millions' do
200
+ subject[100_000_000].should eq('Sto milionów')
201
+ subject[100_000_001].should eq('Sto milionów jeden')
202
+ subject[102_100_000].should eq('Sto dwa miliony sto tysięcy')
203
+ subject[222_000_000].should eq('Dwieście dwadzieścia dwa miliony')
204
+ subject[333_000_000].should eq('Trzysta trzydzieści trzy miliony')
205
+ subject[400_000_000].should eq('Czterysta milionów')
206
+ subject[500_000_000].should eq('Pięćset milionów')
207
+ subject[600_000_000].should eq('Sześćset milionów')
208
+ subject[700_000_000].should eq('Siedemset milionów')
209
+ subject[880_000_000].should eq('Osiemset osiemdziesiąt milionów')
210
+ subject[999_999_999].should eq('Dziewięćset dziewięćdziesiąt dziewięć milionów dziewięćset dziewięćdziesiąt dziewięć tysięcy dziewięćset dziewięćdziesiąt dziewięć')
211
+ end
212
+
213
+ it 'does not support billions' do
214
+ proc { subject[1_000_000_000] }.should raise_error(ArgumentError)
215
+ end
216
+ end
@@ -0,0 +1 @@
1
+ require 'papla'
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: papla
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Olek Janiszewski
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &19504300 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.8.0.rc2
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *19504300
25
+ description: Papla is a Ruby gem that allows you to convert numbers into Polish words
26
+ (e.g. 153 into "sto pięćdziesiąt trzy"), including the decimal part as cents and
27
+ currency symbol. Its primary use case are invoices, where the total amount has to
28
+ be displayed as words at the bottom line.
29
+ email:
30
+ - olek.janiszewski@gmail.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - .gitignore
36
+ - .rspec
37
+ - .rvmrc
38
+ - Gemfile
39
+ - README.md
40
+ - Rakefile
41
+ - lib/papla.rb
42
+ - lib/papla/version.rb
43
+ - papla.gemspec
44
+ - spec/papla_spec.rb
45
+ - spec/spec_helper.rb
46
+ homepage: https://github.com/exviva/papla
47
+ licenses: []
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project: papla
66
+ rubygems_version: 1.8.10
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Use Ruby to convert numbers into Polish words
70
+ test_files: []