money_in_words 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +88 -0
- data/Rakefile +9 -0
- data/lib/money_in_words/core_ext/float.rb +5 -0
- data/lib/money_in_words/core_ext/integer.rb +9 -0
- data/lib/money_in_words/integer.rb +103 -0
- data/lib/money_in_words/money.rb +76 -0
- data/lib/money_in_words/version.rb +3 -0
- data/lib/money_in_words.rb +39 -0
- data/money_in_words.gemspec +25 -0
- data/scratchpad.rb +223 -0
- data/spec/money_in_words_spec.rb +152 -0
- data/spec/spec_helper.rb +15 -0
- metadata +117 -0
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
data/Gemfile
ADDED
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,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,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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|