money_in_words 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 386cca35e9cbb23ea7edc7de5636421a490da873
4
+ data.tar.gz: 38ff827111e84f2ed79f4b43cf420f86f4a21cdd
5
+ SHA512:
6
+ metadata.gz: d12fe6af1abcacee0aeb352dd465aa02c37d916725182b04105e28583c2dd27928ad54a472629a8affaa86ea7178f0fcc2efc0f436789be626a3fa6af7700731
7
+ data.tar.gz: 72b2a1a4343edc8859f8317f30bc7f63b010848e44b013b10c77607919a6b181a48de6d7cc6fb409dd28a47ff05b2327f0cf1537595081ecf1609af5c13aa064
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in money_in_words.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 gmitrev
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Money in Words
2
+
3
+ Turns numbers into words/money. Bulgarian only for the time being.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'money_in_words'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install money_in_words
20
+
21
+ ## Convert numbers to words
22
+ Only works with integers:
23
+
24
+ require "money_in_words"
25
+
26
+ 0.to_words
27
+ => "нула"
28
+
29
+ 1.to_words
30
+ => "един"
31
+
32
+ 1.to_words(article: :neuter)
33
+ => "едно"
34
+
35
+ 1.to_words(article: :female)
36
+ => "една"
37
+
38
+ 11.to_words
39
+ => "единадесет"
40
+
41
+ 33.to_words
42
+ => "тридесет и три"
43
+
44
+ 2000.to_words
45
+ => "две хиляди"
46
+
47
+ 2001.to_words
48
+ => "две хиляди и един"
49
+
50
+ 2001.to_words(article: :female)
51
+ => "две хиляди и една"
52
+
53
+
54
+ ## Conver numbers to money
55
+
56
+ require "money_in_words"
57
+
58
+ 0.to_money
59
+ => "нула лева"
60
+
61
+ 0.5.to_money
62
+ => "нула лева и петдесет стотинки"
63
+
64
+ 0.5.to_money(show_zero_leva: false)
65
+ => "петдесет стотинки"
66
+
67
+ 1.to_money
68
+ => "един лев"
69
+
70
+ 1.to_money(show_zero_stotinki: true)
71
+ => "един лев и нула стотинки"
72
+
73
+ 1.01.to_money
74
+ => "един лев и една стотинка"
75
+
76
+ 1.5.to_money
77
+ => "един лев и петдесет стотинки"
78
+
79
+ 1.53.to_money
80
+ => "един лев и петдесет и три стотинки"
81
+
82
+ ## Contributing
83
+
84
+ 1. Fork it
85
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
86
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
87
+ 4. Push to the branch (`git push origin my-new-feature`)
88
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rspec/core/rake_task'
2
+ require "bundler/gem_tasks"
3
+
4
+
5
+ RSpec::Core::RakeTask.new(:spec) do |task|
6
+ task.rspec_opts = ['--color', '--format', 'nested' ]
7
+ end
8
+
9
+ task :default => :spec
@@ -0,0 +1,5 @@
1
+ class Float
2
+ def to_money(options={})
3
+ MoneyInWords::Money.new(self, options).to_words
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class Integer
2
+ def to_words(options={})
3
+ MoneyInWords::Integer.new(self, options).to_words
4
+ end
5
+
6
+ def to_money(options={})
7
+ MoneyInWords::Money.new(self.to_f, options).to_words
8
+ end
9
+ end
@@ -0,0 +1,103 @@
1
+ require 'pry'
2
+ module MoneyInWords
3
+ class Integer
4
+
5
+ SEPARATOR = ' и '
6
+ ONES = {
7
+ male: %w(нула един два три четири пет шест седем осем девет),
8
+ female: %w(нула една две три четири пет шест седем осем девет),
9
+ neuter: %w(нула едно две три четири пет шест седем осем девет)
10
+ }
11
+ TEENS = %w(десет единадесет дванадесет тринадесет четиринадесет петнадесет шестнадесет седемнадесет осемнадесет деветнадесет)
12
+
13
+ TENS = %w(_ _ двадесет тридесет четиридесет петдесет шестдесет седемдесет осемдесет деветдесет)
14
+ HUNDREDS = %W(#{""} сто двеста триста четиристотин петстотин шестстоин седемстотин осемстотин деветстотин)
15
+
16
+ def initialize(num, options={})
17
+ @num = num
18
+ @options = options
19
+ @article = options[:article] || :male
20
+ end
21
+
22
+ def to_words
23
+ groups = split_number(@num)
24
+ groups.map!{ |h| numerize(h) }
25
+ groups = mega(groups)
26
+ groups.reject!(&:blank?)
27
+ groups = mega_join(groups)
28
+ groups.strip
29
+ end
30
+
31
+ def padleft!(a, n, x)
32
+ a.insert(0, *Array.new([0, n-a.length].max, x))
33
+ end
34
+
35
+ def split_number(num)
36
+ num.to_i.to_s.split(//).map(&:to_i).reverse.each_slice(3).to_a.map(&:reverse).reverse
37
+ end
38
+
39
+ def numerize(triple)
40
+ hun, ten, one = padleft!(triple, 3, 0)
41
+ num = []
42
+ num << HUNDREDS[hun] if hun > 0
43
+
44
+ case ten
45
+ when 0
46
+ num << ONES[@article][one] if one != 0
47
+ when 1
48
+ num << TEENS[one]
49
+ else
50
+ num << TENS[ten]
51
+ num << ONES[@article][one] if one != 0
52
+ end
53
+ njoin(num)
54
+ end
55
+
56
+ def mega(nums)
57
+ mega = %W(#{""} хиляди милионa милиарда)
58
+
59
+ nums.each_with_index.map do |num, i|
60
+ place = nums.length - i - 1
61
+
62
+ # Две хиляди, не два хиляди
63
+ num = 'две' if num == 'два' && place == 1
64
+
65
+ num = ONES[@article][0] if num == '' && place == 0 && nums.count == 1
66
+
67
+ if num == ONES[@article][1] && place == 1
68
+ 'хиляда'
69
+ else
70
+ "#{num} #{mega[place]}"
71
+ end
72
+ end
73
+ end
74
+
75
+ def mega_join(arr, separator=SEPARATOR)
76
+ case arr.length
77
+ when 0
78
+ ''
79
+ when 1
80
+ arr.first
81
+ else
82
+ if arr.last.include?(SEPARATOR)
83
+ arr.join(" ")
84
+ else
85
+ arr[0...-1].join(" ") + separator + arr.last.to_s
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ def njoin(num, separator=SEPARATOR)
92
+ case num.length
93
+ when 0
94
+ ''
95
+ when 1
96
+ num.first
97
+ else
98
+ num[0...-1].join(" ") + separator + num.last.to_s
99
+ end
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,76 @@
1
+ module MoneyInWords
2
+ class Money
3
+
4
+ attr_accessor :levs, :stotinki
5
+
6
+ LEVS = {
7
+ zero: 'лева',
8
+ one: 'лев',
9
+ many: 'лева'
10
+ }
11
+
12
+ STOTINKI = {
13
+ zero: 'стотинки',
14
+ one: 'стотинка',
15
+ many: 'стотинки'
16
+ }
17
+
18
+ def initialize(num, options={})
19
+ @num = num
20
+ @levs, @stotinki = split_number
21
+
22
+ @levs = @levs.to_i
23
+ @stotinki = @stotinki.ljust(2, '0').to_i
24
+
25
+ @options = {
26
+ show_zero_leva: true,
27
+ show_zero_stotinki: false
28
+ }.merge(options)
29
+ end
30
+
31
+ def to_words
32
+ [leva_to_words, stotinki_to_words].compact.join(" и ")
33
+ end
34
+
35
+ def split_number
36
+ @num.to_s.split(".")
37
+ end
38
+
39
+ def levs_suffix
40
+ if @levs == 0
41
+ LEVS[:zero]
42
+ elsif @levs == 1
43
+ LEVS[:one]
44
+ else
45
+ LEVS[:many]
46
+ end
47
+ end
48
+
49
+ def stotinki_suffix
50
+ if @stotinki == 0
51
+ STOTINKI[:zero]
52
+ elsif @stotinki == 1
53
+ STOTINKI[:one]
54
+ else
55
+ STOTINKI[:many]
56
+ end
57
+ end
58
+
59
+ def leva_to_words
60
+ if @levs == 0 && !@options[:show_zero_leva]
61
+ nil
62
+ else
63
+ @levs.to_words + " " + levs_suffix
64
+ end
65
+ end
66
+
67
+ def stotinki_to_words
68
+ if @stotinki == 0 && !@options[:show_zero_stotinki]
69
+ nil
70
+ else
71
+ @stotinki.to_words(article: :female) + " " + stotinki_suffix
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,3 @@
1
+ module MoneyInWords
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,39 @@
1
+ require "money_in_words/integer"
2
+ # require "money_in_words/float"
3
+ require "money_in_words/money"
4
+ require "money_in_words/core_ext/integer"
5
+ require "money_in_words/core_ext/float"
6
+ require "money_in_words/version"
7
+
8
+ module MoneyInWords
9
+
10
+ def self.to_words(num)
11
+ case num
12
+ when Integer
13
+ MoneyInWords::Integer.new(num).to_words
14
+ when Float
15
+ MoneyInWords::Float.new(num).to_words
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ class String
22
+ BLANK_RE = /\A[[:space:]]*\z/
23
+
24
+ # A string is blank if it's empty or contains whitespaces only:
25
+ #
26
+ # ''.blank? # => true
27
+ # ' '.blank? # => true
28
+ # "\t\n\r".blank? # => true
29
+ # ' blah '.blank? # => false
30
+ #
31
+ # Unicode whitespace is supported:
32
+ #
33
+ # "\u00a0".blank? # => true
34
+ #
35
+ # @return [true, false]
36
+ def blank?
37
+ BLANK_RE === self
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'money_in_words/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "money_in_words"
8
+ spec.version = MoneyInWords::VERSION
9
+ spec.authors = ["gmitrev"]
10
+ spec.email = ["gvmitrev@gmail.com"]
11
+ spec.summary = %q{Convert money in words}
12
+ spec.description = %q{}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
25
+ end
data/scratchpad.rb ADDED
@@ -0,0 +1,223 @@
1
+ num = 414.92
2
+
3
+ def num_to_words num
4
+
5
+ currency = {
6
+ zero: "лева",
7
+ one: 'лев',
8
+ many: 'лева'
9
+ }
10
+
11
+ levs = num.to_i
12
+ stotinki = (num % 1).round(2)
13
+
14
+ base = %w(нула един два три четири пет шест седем осем девет)
15
+ teens = %w(десет единадесет дванадесет тринадесет четиринадесет петнадесет шестнадесет седемнадесет осемнадесет)
16
+ tens = %w(десет двадесет тридесет четиридесет петдесет шестдесет седемдесет осемдесет деветдесет)
17
+ hundreds = %w(сто двеста триста четиристотин петстотин шестстоин седемстотин осемстотин деветстотин)
18
+ thousands = {
19
+ one: "хиляда",
20
+ many: 'хиляди'
21
+ }
22
+ millions = {
23
+ one: "милион",
24
+ many: 'милиона'
25
+ }
26
+ d = %w(хиляда, милион, милиард, билион)
27
+
28
+
29
+
30
+ levs.to_s.split(//)
31
+ end
32
+
33
+
34
+ class String
35
+ BLANK_RE = /\A[[:space:]]*\z/
36
+
37
+ # A string is blank if it's empty or contains whitespaces only:
38
+ #
39
+ # ''.blank? # => true
40
+ # ' '.blank? # => true
41
+ # "\t\n\r".blank? # => true
42
+ # ' blah '.blank? # => false
43
+ #
44
+ # Unicode whitespace is supported:
45
+ #
46
+ # "\u00a0".blank? # => true
47
+ #
48
+ # @return [true, false]
49
+ def blank?
50
+ BLANK_RE === self
51
+ end
52
+ end
53
+
54
+
55
+ split_number(1_000_000.0)
56
+
57
+ def padleft!(a, n, x)
58
+ a.insert(0, *Array.new([0, n-a.length].max, x))
59
+ end
60
+ def padright!(a, n, x)
61
+ a.fill(x, a.length...n)
62
+ end
63
+
64
+
65
+ def split_number(num)
66
+ num.to_i.to_s.split(//).map(&:to_i).reverse.each_slice(3).to_a.map(&:reverse).reverse
67
+ end
68
+
69
+
70
+ def numerize(triple)
71
+ base = %w(нула един два три четири пет шест седем осем девет)
72
+ teens = %w(десет единадесет дванадесет тринадесет четиринадесет петнадесет шестнадесет седемнадесет осемнадесет деветнадесет)
73
+
74
+ tens = %w(_ _ двадесет тридесет четиридесет петдесет шестдесет седемдесет осемдесет деветдесет)
75
+ hundreds = %w(_ сто двеста триста четиристотин петстотин шестстоин седемстотин осемстотин деветстотин)
76
+ base[triple.first]
77
+ separator = ' и '
78
+
79
+ case triple.size
80
+ when 1
81
+ base[triple.last]
82
+ when 2
83
+ case triple.first
84
+ when 0
85
+ base[triple.last]
86
+ when 1
87
+ teens[triple.last]
88
+ else
89
+ if triple.last == 0
90
+ tens[triple.first]
91
+ else
92
+ tens[triple.first] + separator + ones(triple.last)
93
+ end
94
+ end
95
+ when 3
96
+ return hundreds[triple.first] if triple.drop(1) == [0,0]
97
+
98
+ case triple[1]
99
+ when *[0,1]
100
+ hundreds[triple.first] + separator + numerize(triple.drop(1))
101
+ else
102
+ hundreds[triple.first] + " " + numerize(triple.drop(1))
103
+ end
104
+ end
105
+
106
+ end
107
+
108
+ def njoin(num, separator=' и ')
109
+ case num.length
110
+ when 0
111
+ ''
112
+ when 1
113
+ num.first
114
+ else
115
+ num[0...-1].join(" ") + separator + num.last.to_s
116
+ end
117
+ end
118
+ njoin [1,2,3]
119
+
120
+ def numerize2(triple)
121
+ ones = %w(нула един два три четири пет шест седем осем девет)
122
+ teens = %w(десет единадесет дванадесет тринадесет четиринадесет петнадесет шестнадесет седемнадесет осемнадесет деветнадесет)
123
+
124
+ tens = %w(_ _ двадесет тридесет четиридесет петдесет шестдесет седемдесет осемдесет деветдесет)
125
+ hundreds = %W(#{""} сто двеста триста четиристотин петстотин шестстоин седемстотин осемстотин деветстотин)
126
+
127
+ hun, ten, one = padleft!(triple, 3, 0)
128
+ num = []
129
+ num << hundreds[hun] if hun > 0
130
+
131
+ case ten
132
+ when 0
133
+ num << ones[one] if one != 0
134
+ when 1
135
+ num << teens[one]
136
+ else
137
+ num << tens[ten]
138
+ num << ones[one] if one != 0
139
+ end
140
+ njoin(num)
141
+ end
142
+
143
+ numerize2([1,0,0])
144
+ numerize2([3,3,0])
145
+ numerize2([0,1,1])
146
+ numerize2([0,0,1])
147
+ numerize2([0,6,1])
148
+
149
+ def mega(nums)
150
+ mega = %W(#{""} хиляди милионa милиарда)
151
+
152
+ nums.each_with_index.map do |num, i|
153
+ place = nums.length - i - 1
154
+
155
+ # Две хиляди, не два хиляди
156
+ num = 'две' if num == 'два' && place == 1
157
+ if num == 'един' && place == 1
158
+ 'хиляда'
159
+ else
160
+ "#{num} #{mega[place]}"
161
+ end
162
+ end
163
+ end
164
+
165
+ def join2(arr, separator=' и ')
166
+ case arr.length
167
+ when 0
168
+ ''
169
+ when 1
170
+ arr.first
171
+ else
172
+ if arr.last.include?(" и ")
173
+ arr.join(" ")
174
+ else
175
+ arr[0...-1].join(" ") + separator + arr.last.to_s
176
+ end
177
+ end
178
+
179
+ end
180
+
181
+ mega(["двадесет", "сто"])
182
+ mega(["триста", "двадесет", "сто"])
183
+ join2 mega(["седем", "триста", "двадесет", "сто и седем"])
184
+
185
+ def wololo(num)
186
+ groups = split_number(num)
187
+ groups.map!{ |h| numerize2(h) }
188
+ groups = mega(groups)
189
+ groups.reject!(&:blank?)
190
+ groups = join2(groups)
191
+ end
192
+
193
+ wololo(1231)
194
+
195
+ wololo(5)
196
+ wololo(15)
197
+ wololo(20)
198
+ wololo(35)
199
+ wololo(77)
200
+ wololo(100)
201
+ wololo(101)
202
+ wololo(111)
203
+ wololo(121)
204
+ wololo(2000)
205
+
206
+
207
+ 0.to_money
208
+ 0.5.to_money
209
+ 0.5.to_money(show_zero_leva: false)
210
+ 1.to_money
211
+ 1.to_money(show_zero_stotinki: true)
212
+ 1.01.to_money
213
+ 1.5.to_money
214
+ 1.53.to_money
215
+
216
+ 0.to_words
217
+ 1.to_words
218
+ 1.to_words(article: :neuter)
219
+ 1.to_words(article: :female)
220
+ 11.to_words
221
+ 33.to_words
222
+ 2000.to_words
223
+ 2001.to_words
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Money in Words' do
4
+
5
+ describe "Integers" do
6
+
7
+ describe 'Male' do
8
+ FIXTURES = [
9
+ [0, 'нула'],
10
+ [1, 'един'],
11
+ [2, 'два'],
12
+ [3, 'три'],
13
+ [4, 'четири'],
14
+ [5, 'пет'],
15
+ [6, 'шест'],
16
+ [7, 'седем'],
17
+ [8, 'осем'],
18
+ [9, 'девет'],
19
+ [10, 'десет'],
20
+ [11, 'единадесет'],
21
+ [12, 'дванадесет'],
22
+ [13, 'тринадесет'],
23
+ [14, 'четиринадесет'],
24
+ [15, 'петнадесет'],
25
+ [16, 'шестнадесет'],
26
+ [17, 'седемнадесет'],
27
+ [18, 'осемнадесет'],
28
+ [19, 'деветнадесет'],
29
+ [20, 'двадесет'],
30
+ [22, 'двадесет и два'],
31
+ [30, 'тридесет'],
32
+ [60, 'шестдесет'],
33
+ [66, 'шестдесет и шест'],
34
+ [99, 'деветдесет и девет'],
35
+ [100, 'сто'],
36
+ [101, 'сто и един'],
37
+ [112, 'сто и дванадесет'],
38
+ [120, 'сто и двадесет'],
39
+ [123, 'сто двадесет и три'],
40
+ [223, 'двеста двадесет и три'],
41
+ [1000, 'хиляда'],
42
+ [1001, 'хиляда и един'],
43
+ [1010, 'хиляда и десет'],
44
+ [1011, 'хиляда и единадесет'],
45
+ [1100, 'хиляда и сто'],
46
+ [1101, 'хиляда сто и един'],
47
+ [1111, 'хиляда сто и единадесет'],
48
+ [1126, 'хиляда сто двадесет и шест'],
49
+ [2000, 'две хиляди'],
50
+ [2500, 'две хиляди и петстотин'],
51
+ ]
52
+
53
+ FIXTURES.each do |f|
54
+ it "male example #{f.first} " do
55
+ expect(f.first.to_words).to eq f.last
56
+ end
57
+ end
58
+ end
59
+
60
+ describe 'Female' do
61
+ FIXTURES = [
62
+ [0, 'нула'],
63
+ [1, 'една'],
64
+ [2, 'две'],
65
+ [3, 'три'],
66
+ [4, 'четири'],
67
+ [5, 'пет'],
68
+ [6, 'шест'],
69
+ [7, 'седем'],
70
+ [8, 'осем'],
71
+ [9, 'девет'],
72
+ [10, 'десет'],
73
+ [11, 'единадесет'],
74
+ [12, 'дванадесет'],
75
+ [13, 'тринадесет'],
76
+ [14, 'четиринадесет'],
77
+ [15, 'петнадесет'],
78
+ [16, 'шестнадесет'],
79
+ [17, 'седемнадесет'],
80
+ [18, 'осемнадесет'],
81
+ [19, 'деветнадесет'],
82
+ [20, 'двадесет'],
83
+ [22, 'двадесет и две'],
84
+ [30, 'тридесет'],
85
+ [60, 'шестдесет'],
86
+ [66, 'шестдесет и шест'],
87
+ [99, 'деветдесет и девет'],
88
+ [100, 'сто'],
89
+ [101, 'сто и една'],
90
+ [112, 'сто и дванадесет'],
91
+ [120, 'сто и двадесет'],
92
+ [123, 'сто двадесет и три'],
93
+ [223, 'двеста двадесет и три'],
94
+ [1000, 'хиляда'],
95
+ [1001, 'хиляда и една'],
96
+ [1010, 'хиляда и десет'],
97
+ [1011, 'хиляда и единадесет'],
98
+ [1100, 'хиляда и сто'],
99
+ [1101, 'хиляда сто и една'],
100
+ [1111, 'хиляда сто и единадесет'],
101
+ [1126, 'хиляда сто двадесет и шест'],
102
+ [2000, 'две хиляди'],
103
+ [2500, 'две хиляди и петстотин'],
104
+ ]
105
+
106
+ FIXTURES.each do |f|
107
+ it "female example #{f.first} " do
108
+ expect(f.first.to_words(article: :female)).to eq f.last
109
+ end
110
+ end
111
+ end
112
+
113
+ end
114
+
115
+ describe "Money" do
116
+
117
+ FIXTURES = [
118
+ [0, 'нула лева'],
119
+ [0.5, 'нула лева и петдесет стотинки'],
120
+ [1, 'един лев'],
121
+ [1.2, 'един лев и двадесет стотинки'],
122
+ [2.22, 'два лева и двадесет и две стотинки'],
123
+ [3.99, 'три лева и деветдесет и девет стотинки'],
124
+ [4.01, 'четири лева и една стотинка'],
125
+ [5.11, 'пет лева и единадесет стотинки'],
126
+ [2500.08, 'две хиляди и петстотин лева и осем стотинки'],
127
+ ]
128
+
129
+ FIXTURES.each do |f|
130
+ it "example #{f.first} " do
131
+ expect(f.first.to_money).to eq f.last
132
+ end
133
+ end
134
+
135
+ it "example 3 without stotinki" do
136
+ expect(3.to_money(show_zero_stotinki: false)).to eq "три лева"
137
+ end
138
+
139
+ it "example 3 with stotinki" do
140
+ expect(3.to_money(show_zero_stotinki: true)).to eq "три лева и нула стотинки"
141
+ end
142
+
143
+ it "example 0.50 with leva" do
144
+ expect(0.5.to_money(show_zero_leva: true)).to eq "нула лева и петдесет стотинки"
145
+ end
146
+
147
+ it "example 0.50 without leva" do
148
+ expect(0.5.to_money(show_zero_leva: false)).to eq "петдесет стотинки"
149
+ end
150
+
151
+ end
152
+ end
@@ -0,0 +1,15 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'money_in_words'
5
+
6
+
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+ config.filter_run_excluding :brute
12
+
13
+
14
+ config.order = 'random'
15
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: money_in_words
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - gmitrev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: ''
70
+ email:
71
+ - gvmitrev@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - lib/money_in_words.rb
82
+ - lib/money_in_words/core_ext/float.rb
83
+ - lib/money_in_words/core_ext/integer.rb
84
+ - lib/money_in_words/integer.rb
85
+ - lib/money_in_words/money.rb
86
+ - lib/money_in_words/version.rb
87
+ - money_in_words.gemspec
88
+ - scratchpad.rb
89
+ - spec/money_in_words_spec.rb
90
+ - spec/spec_helper.rb
91
+ homepage: ''
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.2.2
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Convert money in words
115
+ test_files:
116
+ - spec/money_in_words_spec.rb
117
+ - spec/spec_helper.rb