papla 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +9 -5
- data/README.md +16 -3
- data/lib/papla.rb +26 -87
- data/lib/papla/fixnum_converter.rb +71 -0
- data/lib/papla/float_converter.rb +21 -0
- data/lib/papla/money_converter.rb +13 -0
- data/lib/papla/version.rb +1 -1
- data/papla.gemspec +1 -0
- data/spec/en_spec.rb +7 -0
- data/spec/pl_spec.rb +7 -0
- data/spec/spec_helper.rb +1 -0
- metadata +22 -8
data/CHANGELOG.md
CHANGED
@@ -1,20 +1,24 @@
|
|
1
|
+
### 0.1.0 (2012-04-20)
|
2
|
+
|
3
|
+
* Support Money
|
4
|
+
|
1
5
|
### 0.0.5 (2012-01-21)
|
2
6
|
|
3
7
|
* Make converting decimal points more robust
|
4
8
|
|
5
9
|
### 0.0.4 (2012-01-21)
|
6
10
|
|
7
|
-
*
|
11
|
+
* Support English locale
|
8
12
|
|
9
13
|
### 0.0.3 (2012-01-16)
|
10
14
|
|
11
|
-
*
|
15
|
+
* Provide localization using I18n
|
12
16
|
|
13
17
|
### 0.0.2 (2011-01-09)
|
14
18
|
|
15
|
-
*
|
19
|
+
* Display decimal part of floats as cents/100
|
16
20
|
|
17
21
|
### 0.0.1 (2011-01-03)
|
18
22
|
|
19
|
-
*
|
20
|
-
*
|
23
|
+
* Initial release
|
24
|
+
* Support converting numbers from 0 up to 999 999 999 to Polish words
|
data/README.md
CHANGED
@@ -54,7 +54,7 @@ Papla[2.999] # => "Trzy 00/100"
|
|
54
54
|
|
55
55
|
This feature is planned for future releases.
|
56
56
|
|
57
|
-
## Integration with
|
57
|
+
## Integration with I18n and Money
|
58
58
|
|
59
59
|
### I18n
|
60
60
|
|
@@ -64,9 +64,22 @@ for details of keys used. Currently `:pl` and `:en` locales are supported.
|
|
64
64
|
Note: English support is not fully correct, e.g. `123` becomes
|
65
65
|
`"One hundred twenty three"` and not `"One hundred and twenty three"`.
|
66
66
|
|
67
|
-
### Money
|
67
|
+
### Money
|
68
68
|
|
69
|
-
|
69
|
+
If you're using the `money` gem, you can pass in an instance of `Money` to Papla.
|
70
|
+
The returned string will contain the dollars part as words,
|
71
|
+
the cents part as 'xx/100' and the currency string (e.g. `EUR`).
|
72
|
+
|
73
|
+
Example:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
eleven_and_a_half_pounds = Money.new(1150, 'GBP')
|
77
|
+
Papla[eleven_and_a_half_pounds] # => "Jedenaście 50/100 GBP"
|
78
|
+
|
79
|
+
I18n.locale = :en
|
80
|
+
discounted_price = Money.new(9999, 'PLN')
|
81
|
+
Papla[discounted_price] # => "Ninety nine 99/100 PLN"
|
82
|
+
```
|
70
83
|
|
71
84
|
## Documentation
|
72
85
|
|
data/lib/papla.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'bigdecimal'
|
2
|
-
require 'bigdecimal/util'
|
3
|
-
require 'papla/backend'
|
4
|
-
require 'papla/version'
|
5
|
-
|
6
1
|
module Papla
|
2
|
+
autoload :Backend, 'papla/backend'
|
3
|
+
autoload :FixnumConverter, 'papla/fixnum_converter'
|
4
|
+
autoload :FloatConverter, 'papla/float_converter'
|
5
|
+
autoload :MoneyConverter, 'papla/money_converter'
|
6
|
+
|
7
7
|
# Converts a number to Polish or English words,
|
8
8
|
# capitalizing the first letter of the whole phrase.
|
9
9
|
#
|
@@ -40,96 +40,35 @@ module Papla
|
|
40
40
|
# Papla[87.654321] # => "Osiemdziesiąt siedem 65/100"
|
41
41
|
# Papla[2.999] # => "Trzy 00/100"
|
42
42
|
#
|
43
|
+
# If you're using the `money` gem, you can pass in an instance
|
44
|
+
# of `Money` to Papla. The returned string will contain the dollars
|
45
|
+
# part as words, the cents part as 'xx/100' and the currency
|
46
|
+
# string (e.g. `EUR`).
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
#
|
50
|
+
# eleven_and_a_half_pounds = Money.new(1150, 'GBP')
|
51
|
+
# Papla[eleven_and_a_half_pounds] # => "Jedenaście 50/100 GBP"
|
52
|
+
#
|
53
|
+
# I18n.locale = :en
|
54
|
+
# discounted_price = Money.new(9999, 'PLN')
|
55
|
+
# Papla[discounted_price] # => "Ninety nine 99/100 PLN"
|
56
|
+
#
|
43
57
|
# @param [Fixnum] number the number to convert
|
44
58
|
# @return [String] the phrase in Polish or English
|
45
59
|
def self.[](number)
|
46
|
-
|
47
|
-
|
48
|
-
basic_number = number.to_i
|
49
|
-
basic_phrase = build_basic_phrase(basic_number)
|
50
|
-
|
51
|
-
case number
|
52
|
-
when Float; append_cents(basic_phrase, number)
|
53
|
-
else basic_phrase
|
54
|
-
end
|
60
|
+
converter = converter_for(number)
|
61
|
+
converter.new.convert(number)
|
55
62
|
end
|
56
63
|
|
57
64
|
private
|
58
65
|
|
59
|
-
def self.
|
66
|
+
def self.converter_for(number)
|
60
67
|
case number
|
61
|
-
when
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
def self.build_basic_phrase(basic_number)
|
67
|
-
if basic_number.zero?
|
68
|
-
spell_zero
|
69
|
-
else
|
70
|
-
groups = group(basic_number)
|
71
|
-
groups_as_words = convert_groups(groups)
|
72
|
-
groups_as_words.flatten.join(' ')
|
73
|
-
end.capitalize
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.group(number)
|
77
|
-
groups = []
|
78
|
-
|
79
|
-
while number > 0
|
80
|
-
number, group = number.divmod(1000)
|
81
|
-
groups.unshift(group)
|
68
|
+
when defined?(Money) && Money then MoneyConverter
|
69
|
+
when Float then FloatConverter
|
70
|
+
when Fixnum then FixnumConverter
|
71
|
+
else raise ArgumentError, "Unsupported type: #{klass}"
|
82
72
|
end
|
83
|
-
|
84
|
-
groups
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.convert_groups(groups)
|
88
|
-
bound = groups.count - 1
|
89
|
-
result = []
|
90
|
-
|
91
|
-
groups.each_with_index do |group, i|
|
92
|
-
if group > 0
|
93
|
-
result << convert_small_number(group)
|
94
|
-
result << spell_rank(bound - i, group) if i < bound
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
result
|
99
|
-
end
|
100
|
-
|
101
|
-
def self.convert_small_number(number)
|
102
|
-
if number.zero?
|
103
|
-
[]
|
104
|
-
elsif number < 20
|
105
|
-
[spell_ones(number)]
|
106
|
-
elsif number < 100
|
107
|
-
tens, remainder = number.divmod(10)
|
108
|
-
[spell_tens(tens), convert_small_number(remainder)]
|
109
|
-
else
|
110
|
-
hundreds, remainder = number.divmod(100)
|
111
|
-
[spell_hundreds(hundreds), convert_small_number(remainder)]
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def self.validate!(number)
|
116
|
-
max = 999_999_999
|
117
|
-
raise ArgumentError, "#{number} is too big, only numbers up to #{max} are supported" if number > max
|
118
|
-
end
|
119
|
-
|
120
|
-
def self.append_cents(basic_phrase, number)
|
121
|
-
cents = 100 * (number.to_d - number.to_i)
|
122
|
-
spell_cents(basic_phrase, cents)
|
123
|
-
end
|
124
|
-
|
125
|
-
def self.backend
|
126
|
-
@backend ||= Backend.new
|
127
73
|
end
|
128
|
-
|
129
|
-
def self.spell_zero; backend.zero; end
|
130
|
-
def self.spell_ones(index); backend.ones(index); end
|
131
|
-
def self.spell_tens(index); backend.tens(index); end
|
132
|
-
def self.spell_hundreds(index); backend.hundreds(index); end
|
133
|
-
def self.spell_rank(index, number); backend.rank(index, number); end
|
134
|
-
def self.spell_cents(basic_phrase, cents); backend.cents(basic_phrase, cents); end
|
135
74
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Papla
|
2
|
+
class FixnumConverter
|
3
|
+
def convert(number)
|
4
|
+
validate!(number)
|
5
|
+
|
6
|
+
if number.zero?
|
7
|
+
spell_zero
|
8
|
+
else
|
9
|
+
groups = group(number)
|
10
|
+
groups_as_words = convert_groups(groups)
|
11
|
+
groups_as_words.flatten.join(' ')
|
12
|
+
end.capitalize
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def validate!(number)
|
18
|
+
max = 999_999_999
|
19
|
+
raise ArgumentError, "#{number} is too big, only numbers up to #{max} are supported" if number > max
|
20
|
+
end
|
21
|
+
|
22
|
+
def group(number)
|
23
|
+
groups = []
|
24
|
+
|
25
|
+
while number > 0
|
26
|
+
number, group = number.divmod(1000)
|
27
|
+
groups.unshift(group)
|
28
|
+
end
|
29
|
+
|
30
|
+
groups
|
31
|
+
end
|
32
|
+
|
33
|
+
def convert_groups(groups)
|
34
|
+
bound = groups.count - 1
|
35
|
+
result = []
|
36
|
+
|
37
|
+
groups.each_with_index do |group, i|
|
38
|
+
if group > 0
|
39
|
+
result << convert_small_number(group)
|
40
|
+
result << spell_rank(bound - i, group) if i < bound
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
result
|
45
|
+
end
|
46
|
+
|
47
|
+
def convert_small_number(number)
|
48
|
+
if number.zero?
|
49
|
+
[]
|
50
|
+
elsif number < 20
|
51
|
+
[spell_ones(number)]
|
52
|
+
elsif number < 100
|
53
|
+
tens, remainder = number.divmod(10)
|
54
|
+
[spell_tens(tens), convert_small_number(remainder)]
|
55
|
+
else
|
56
|
+
hundreds, remainder = number.divmod(100)
|
57
|
+
[spell_hundreds(hundreds), convert_small_number(remainder)]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def backend
|
62
|
+
@backend ||= Backend.new
|
63
|
+
end
|
64
|
+
|
65
|
+
def spell_zero; backend.zero; end
|
66
|
+
def spell_ones(index); backend.ones(index); end
|
67
|
+
def spell_tens(index); backend.tens(index); end
|
68
|
+
def spell_hundreds(index); backend.hundreds(index); end
|
69
|
+
def spell_rank(index, number); backend.rank(index, number); end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
require 'bigdecimal/util'
|
3
|
+
|
4
|
+
module Papla
|
5
|
+
class FloatConverter < FixnumConverter
|
6
|
+
def convert(number)
|
7
|
+
number = number.round(2)
|
8
|
+
append_cents(super(number.to_i), number)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def append_cents(basic_phrase, number)
|
14
|
+
cents = 100 * (number.to_d - number.to_i)
|
15
|
+
cents = cents.round(2)
|
16
|
+
spell_cents(basic_phrase, cents)
|
17
|
+
end
|
18
|
+
|
19
|
+
def spell_cents(basic_phrase, cents); backend.cents(basic_phrase, cents); end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Papla
|
2
|
+
class MoneyConverter < FloatConverter
|
3
|
+
def convert(number)
|
4
|
+
append_currency(super(number.to_f.round(2)), number)
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def append_currency(phrase, money)
|
10
|
+
'%s %s' % [phrase, money.currency_as_string]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/papla/version.rb
CHANGED
data/papla.gemspec
CHANGED
data/spec/en_spec.rb
CHANGED
@@ -236,4 +236,11 @@ describe Papla, 'en' do
|
|
236
236
|
subject[111_111.2].should eq('One hundred eleven thousand one hundred eleven 20/100')
|
237
237
|
end
|
238
238
|
end
|
239
|
+
|
240
|
+
describe 'money' do
|
241
|
+
it 'concatenates dollars, cents and currency' do
|
242
|
+
discounted_price = Money.new(9999, 'PLN')
|
243
|
+
Papla[discounted_price].should eq('Ninety nine 99/100 PLN')
|
244
|
+
end
|
245
|
+
end
|
239
246
|
end
|
data/spec/pl_spec.rb
CHANGED
@@ -237,4 +237,11 @@ describe Papla, 'pl' do
|
|
237
237
|
subject[111_111.2].should eq('Sto jedenaście tysięcy sto jedenaście 20/100')
|
238
238
|
end
|
239
239
|
end
|
240
|
+
|
241
|
+
describe 'money' do
|
242
|
+
it 'concatenates dollars, cents and currency' do
|
243
|
+
eleven_and_a_half_pounds = Money.new(1150, 'GBP')
|
244
|
+
Papla[eleven_and_a_half_pounds].should eq('Jedenaście 50/100 GBP')
|
245
|
+
end
|
246
|
+
end
|
240
247
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: papla
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: i18n
|
16
|
-
requirement: &
|
16
|
+
requirement: &17749220 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *17749220
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: money
|
27
|
+
requirement: &17748560 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *17748560
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: rspec
|
27
|
-
requirement: &
|
38
|
+
requirement: &17763960 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: 2.8.0
|
33
44
|
type: :development
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *17763960
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: rake
|
38
|
-
requirement: &
|
49
|
+
requirement: &17763380 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,7 +54,7 @@ dependencies:
|
|
43
54
|
version: '0'
|
44
55
|
type: :development
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *17763380
|
47
58
|
description: Papla is a Ruby gem that allows you to convert numbers into Polish and
|
48
59
|
English words.
|
49
60
|
email:
|
@@ -62,10 +73,13 @@ files:
|
|
62
73
|
- Rakefile
|
63
74
|
- lib/papla.rb
|
64
75
|
- lib/papla/backend.rb
|
76
|
+
- lib/papla/fixnum_converter.rb
|
77
|
+
- lib/papla/float_converter.rb
|
65
78
|
- lib/papla/locale/en.rb
|
66
79
|
- lib/papla/locale/en.yml
|
67
80
|
- lib/papla/locale/pl.rb
|
68
81
|
- lib/papla/locale/pl.yml
|
82
|
+
- lib/papla/money_converter.rb
|
69
83
|
- lib/papla/version.rb
|
70
84
|
- papla.gemspec
|
71
85
|
- spec/en_spec.rb
|