moneytize 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 02fd4f54325cb10dd242d68fea3c73620a1960dc
4
+ data.tar.gz: 6b1903d2e77d011fb3427848e746971a8ca7d0d1
5
+ SHA512:
6
+ metadata.gz: 6d1e63658bb7338f77df3714ad3f6e3eff04833ffebef406602e5d5eabbe10d931b454d805fee491858733963a18b091be99ae40db6679a1664c45eb4d7e10b1
7
+ data.tar.gz: ea02d22b1798eb24b18fb9bbcd4da0ab83c7de0d3ce41d3eb3110f7f1b837a34f1553dbd9d5a4c3442d0f896fc868408a842ac4d0a90aee1122bd323cdd1c599
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ *.gem
3
+ .yardoc/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+ gem 'rake', group: :test
@@ -0,0 +1,22 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ moneytize (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ byebug (3.1.2)
10
+ columnize (~> 0.8)
11
+ debugger-linecache (~> 1.2)
12
+ columnize (0.8.9)
13
+ debugger-linecache (1.2.0)
14
+ rake (10.1.0)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ byebug (~> 3.1.2)
21
+ moneytize!
22
+ rake
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jaime Andres
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.
@@ -0,0 +1,20 @@
1
+ # MONEYTIZE
2
+ Did you ever have the requirement:
3
+ > Can you format the value as currency with "," as decimal separator
4
+
5
+ or
6
+
7
+ > Can you display " ' " as millions separator
8
+
9
+ It's not too hard to parse a numeric value to format it the way you want,
10
+ but why would you like to repeat the same process every time you need to parse
11
+ a numeric value as currency.
12
+
13
+ *_THAT'S WHY MONEYTIZE EXISTS_*
14
+
15
+ Just call it with the value to be formatted and the options you expect:
16
+ ```
17
+ Moneytize::Currency.format(123456.9803, { currency_symbol: '$', decimal: ',' })
18
+ ```
19
+
20
+ Check the [documentation](#) to see the options you have.
@@ -0,0 +1,95 @@
1
+ require 'version'
2
+
3
+ # Moneytize is a simple formatter for currency, it allows to format any currency the way you like,
4
+ # for example, you can decide to separate thousands with ',' and decimals with '.'.
5
+ # Please consider that to avoid unnecessary complexity there are a few valid separators: ',', '.', ' ' and '¢'.
6
+ # For millions separator you can only choose to use it or not, the separator to be used is "'"
7
+ module Moneytize
8
+
9
+ # This class is in charge to format any numeric value to the expected currency format.
10
+ class Currency
11
+
12
+ # Converts any numeric value to a formatted string based on the conditions (separators) send
13
+ # to the method,
14
+ #
15
+ # The default values are:
16
+ # decimals: '.'
17
+ # thousands: ''
18
+ # millions: false
19
+ # currency_symbol: ''
20
+ #
21
+ # @param value [Numeric] the value to be formatted
22
+ # @param options [Hash] collection of values to be used as separators:
23
+ # { currency_symbol: '|$|USD|etc|', decimal: "|,|.| |¢|",
24
+ # thoushands: "|,|.| |", millions: true|false }
25
+ #
26
+ # @return [String] the numeric value formatted to string
27
+ def self.format(value, options = {})
28
+ currency = Currency.new
29
+
30
+ currency.prepare_separators(options)
31
+ currency.format_currency_for(value)
32
+ end
33
+
34
+ # Prepare decimals, thousands and millions separators based on parameters passed and defaults
35
+ def prepare_separators(options)
36
+ fetch_separators(options)
37
+ validate_separators
38
+ end
39
+
40
+ # Formats numeric value to string based on separators previously setted
41
+ def format_currency_for(value)
42
+ currency = format('%0.2f', value).split('.')
43
+ currency[0] = thousands(millions(currency[0])).join(@millions).reverse!
44
+
45
+ @currency_symbol.concat(currency.join(@decimal))
46
+ end
47
+
48
+ private
49
+
50
+ def fetch_separators(options)
51
+ @currency_symbol = options.fetch(:currency_symbol, '')
52
+ @decimal = options.fetch(:decimal, '.')
53
+ @thousands = options.fetch(:thousands, '')
54
+ @millions = "'" if options[:millions]
55
+ end
56
+
57
+ def validate_separators
58
+ allowed_symbols = ['.', ',', ' ']
59
+
60
+ @decimal = '.' unless allowed_symbols.push('¢').include?(@decimal)
61
+ @thousands = '' unless allowed_symbols.include?(@thousands)
62
+
63
+ if @thousands == @decimal
64
+ @decimal = '.' if @thousands == ',' or @thousands == ' '
65
+ @decimal = ',' if @thousands == '.'
66
+ end
67
+ end
68
+
69
+ def millions(amount)
70
+ slice_amount(amount.reverse!, 6)
71
+ end
72
+
73
+ def thousands(amounts)
74
+ amounts = [amounts] if amounts.is_a?(String)
75
+
76
+ amounts.map! { |amount| slice_thousands(amount) }
77
+ end
78
+
79
+ def slice_thousands(amount)
80
+ thousand = slice_amount(amount, 3)
81
+ thousand.is_a?(String) ? thousand : thousand.join(@thousands)
82
+ end
83
+
84
+ def slice_amount(amount, unit_size)
85
+ return amount unless amount.size > unit_size
86
+
87
+ range = unit_size - 1
88
+ min_size = unit_size + 1
89
+
90
+ final_amount = []
91
+ final_amount << amount.slice!(0..range) until amount.size < min_size
92
+ final_amount << amount
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,3 @@
1
+ module Moneytize
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = 'moneytize'
9
+ gem.version = Moneytize::VERSION
10
+ gem.homepage = "http://moneytize.me"
11
+ gem.licenses = ["MIT"]
12
+ gem.authors = ['DiabloUrbano']
13
+ gem.email = ['andresdavila6@gmail.com']
14
+ gem.description = 'formats any numeric value to the expected currency format, choose dot, comma, space or even ¢ for cents. Just check it!'
15
+ gem.summary = 'format your currency the way you expect.'
16
+
17
+ gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
18
+ gem.test_files = gem.files.grep(/^(tests|spec|features)/)
19
+ gem.require_paths = ['lib']
20
+
21
+ gem.has_rdoc = 'yard'
22
+
23
+ # ruby version
24
+ gem.required_ruby_version = '>= 1.9.3'
25
+
26
+ if RUBY_VERSION == '1.9.3'
27
+ gem.add_development_dependency 'debugger', '~> 1.6.6'
28
+ elsif RUBY_VERSION >= '2.0.0'
29
+ gem.add_development_dependency 'byebug', '~> 3.1.2'
30
+ end
31
+ end
@@ -0,0 +1,74 @@
1
+ require 'test/unit'
2
+ require_relative '../lib/moneytize'
3
+
4
+ class TestMoneytize < Test::Unit::TestCase
5
+ def test_format_without_decimals
6
+ currency = Moneytize::Currency.format(1025)
7
+ assert_equal('1025.00', currency)
8
+ end
9
+
10
+ def test_format_default
11
+ currency = Moneytize::Currency.format(1025.54)
12
+ assert_equal('1025.54', currency)
13
+ end
14
+
15
+ def test_format_with_different_symbol
16
+ currency = Moneytize::Currency.format(1025.54, currency_symbol: 'USD')
17
+ assert_equal('USD1025.54', currency)
18
+ end
19
+
20
+ def test_format_with_different_decimal_separator
21
+ currency = Moneytize::Currency.format(1025.54, decimal: ',')
22
+ assert_equal('1025,54', currency)
23
+ end
24
+
25
+ def test_format_with_different_decimal_separator
26
+ currency = Moneytize::Currency.format(1025.54, decimal: '¢', currency_symbol: '$')
27
+ assert_equal('$1025¢54', currency)
28
+ end
29
+
30
+ def test_format_with_different_thousand_separator
31
+ currency = Moneytize::Currency.format(1025.54, thousands: '.', currency_symbol: '$')
32
+ assert_equal('$1.025,54', currency)
33
+ end
34
+
35
+ def test_format_with_different_thousand_separator_comma
36
+ currency = Moneytize::Currency.format(1025.54, thousands: ',', decimal: ',', currency_symbol: '$')
37
+ assert_equal('$1,025.54', currency)
38
+ end
39
+
40
+ def test_format_with_different_thousand_separator_and_decimal_separator
41
+ currency = Moneytize::Currency.format(1025.54, decimal: ',', thousands: '.', currency_symbol: '$')
42
+ assert_equal('$1.025,54', currency)
43
+ end
44
+
45
+ def test_format_with_millions
46
+ currency = Moneytize::Currency.format(14578025.54823424, currency_symbol: '$')
47
+ assert_equal('$14578025.55', currency)
48
+ end
49
+
50
+ def test_format_with_millions_separator
51
+ currency = Moneytize::Currency.format(14578025.54823424, millions: true, currency_symbol: '$')
52
+ assert_equal("$14'578025.55", currency)
53
+ end
54
+
55
+ def test_format_with_millions_and_thousands_separator
56
+ currency = Moneytize::Currency.format(14578025.54823424, millions: true, thousands: '.', currency_symbol: '$')
57
+ assert_equal("$14'578.025,55", currency)
58
+ end
59
+
60
+ def test_billions_with_format_with_millions_and_thousands_separator
61
+ currency = Moneytize::Currency.format(14897456578025.54823424, millions: true, thousands: '.', currency_symbol: '$')
62
+ assert_equal("$14'897.456'578.025,55", currency)
63
+ end
64
+
65
+ def test_format_with_hundreds
66
+ currency = Moneytize::Currency.format(125.55, millions: true, thousands: '.', currency_symbol: '$')
67
+ assert_equal('$125,55', currency)
68
+ end
69
+
70
+ def test_it_should_allow_only_specific_separators_or_use_default_values
71
+ currency = Moneytize::Currency.format(12589080.78, millions: false, thousands: '*', decimal: '%', currency_symbol: '$')
72
+ assert_equal('$12589080.78', currency)
73
+ end
74
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moneytize
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - DiabloUrbano
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: byebug
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.2
27
+ description: formats any numeric value to the expected currency format, choose dot,
28
+ comma, space or even ¢ for cents. Just check it!
29
+ email:
30
+ - andresdavila6@gmail.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - ".gitignore"
36
+ - Gemfile
37
+ - Gemfile.lock
38
+ - LICENSE.txt
39
+ - README.md
40
+ - lib/moneytize.rb
41
+ - lib/version.rb
42
+ - moneytize.gemspec
43
+ - tests/tc_moneytize.rb
44
+ homepage: http://moneytize.me
45
+ licenses:
46
+ - MIT
47
+ metadata: {}
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 1.9.3
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubyforge_project:
64
+ rubygems_version: 2.2.2
65
+ signing_key:
66
+ specification_version: 4
67
+ summary: format your currency the way you expect.
68
+ test_files:
69
+ - tests/tc_moneytize.rb
70
+ has_rdoc: yard