extenso_pt 0.7.2 → 0.7.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60c6fc6aeadb5973a9f9d9b59a2f92a8343c4d4e72dd5ac20d4fe70489022805
4
- data.tar.gz: 16f3545f8a2a36a14d039c5b92a2f02da487c4f4eef6614ca2d06a83e93d7f3f
3
+ metadata.gz: 9c1197e63db503115dcb1f8967f6aa91e878d94123af6fda8fd90ea3ccd39d4d
4
+ data.tar.gz: cbcf06619481b5c91cb21f76b9bf2538bf4e35edaf49536da0c66cd8f9bc4c35
5
5
  SHA512:
6
- metadata.gz: 1edbcbaf07ff510ab740dcd228a3616a18c9e1e4e54b664254eb24ffa34086b2a975f250b5a48a57f226c1346d75e5d7d826ed996ee44a95192716a01e47e482
7
- data.tar.gz: 4f64f33054298180070746a3c110bc29e40a2513418be0744c0d9074bcebe9245d68f3047b68897e5c2d48d198c4f35f5e78d9a438a4f2c4d881384aea74fdcd
6
+ metadata.gz: 2eeef659a88105d402f9762f9e4cff28f832024b1f1de8abcd28edbf4df07bafbedc04a1f8fe44379230b0c9e57206410af5fbd5ef09be267d08b4eca28b31fd
7
+ data.tar.gz: b64094837b3229670b87effd516638d617cf5265db5400148d50bea84460bab4fc1346ba40dfad8e0000bc1118ee5ead33db28bc84a56c1b2898af80aee78bf3
@@ -3,5 +3,5 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
- - 2.6.3
6
+ - 2.7.0
7
7
  script: bundle exec rake test
@@ -1,15 +1,69 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- extenso_pt (0.7.2)
4
+ extenso_pt (0.7.7)
5
5
  bigdecimal
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ ast (2.4.1)
11
+ backport (1.1.2)
12
+ benchmark (0.1.0)
10
13
  bigdecimal (2.0.0)
11
- minitest (5.14.1)
14
+ e2mmap (0.1.0)
15
+ jaro_winkler (1.5.4)
16
+ kwalify (0.7.2)
17
+ maruku (0.7.3)
18
+ mini_portile2 (2.4.0)
19
+ minitest (5.14.2)
20
+ nokogiri (1.10.10)
21
+ mini_portile2 (~> 2.4.0)
22
+ parallel (1.19.2)
23
+ parser (2.7.2.0)
24
+ ast (~> 2.4.1)
25
+ psych (3.2.0)
26
+ rainbow (3.0.0)
12
27
  rake (13.0.1)
28
+ reek (6.0.2)
29
+ kwalify (~> 0.7.0)
30
+ parser (>= 2.5.0.0, < 2.8, != 2.5.1.1)
31
+ psych (~> 3.1)
32
+ rainbow (>= 2.0, < 4.0)
33
+ regexp_parser (1.8.2)
34
+ reverse_markdown (2.0.0)
35
+ nokogiri
36
+ rexml (3.2.4)
37
+ rubocop (0.93.1)
38
+ parallel (~> 1.10)
39
+ parser (>= 2.7.1.5)
40
+ rainbow (>= 2.2.2, < 4.0)
41
+ regexp_parser (>= 1.8)
42
+ rexml
43
+ rubocop-ast (>= 0.6.0)
44
+ ruby-progressbar (~> 1.7)
45
+ unicode-display_width (>= 1.4.0, < 2.0)
46
+ rubocop-ast (1.0.0)
47
+ parser (>= 2.7.1.5)
48
+ ruby-progressbar (1.10.1)
49
+ solargraph (0.39.17)
50
+ backport (~> 1.1)
51
+ benchmark
52
+ bundler (>= 1.17.2)
53
+ e2mmap
54
+ jaro_winkler (~> 1.5)
55
+ maruku (~> 0.7, >= 0.7.3)
56
+ nokogiri (~> 1.9, >= 1.9.1)
57
+ parser (~> 2.3)
58
+ reverse_markdown (>= 1.0.5, < 3)
59
+ rubocop (~> 0.52)
60
+ thor (~> 1.0)
61
+ tilt (~> 2.0)
62
+ yard (~> 0.9, >= 0.9.24)
63
+ thor (1.0.1)
64
+ tilt (2.0.10)
65
+ unicode-display_width (1.7.0)
66
+ yard (0.9.25)
13
67
 
14
68
  PLATFORMS
15
69
  ruby
@@ -19,6 +73,10 @@ DEPENDENCIES
19
73
  extenso_pt!
20
74
  minitest
21
75
  rake
76
+ reek
77
+ rubocop
78
+ solargraph
79
+ yard
22
80
 
23
81
  BUNDLED WITH
24
82
  2.1.4
data/README.md CHANGED
@@ -6,9 +6,7 @@ Produz extenso em portugês de portugal, brasil ou numeracao romana. Os valores
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
- ```ruby
10
- gem 'extenso_pt'
11
- ```
9
+ gem 'extenso_pt'
12
10
 
13
11
  And then execute:
14
12
 
@@ -20,26 +18,24 @@ Or install it yourself as:
20
18
 
21
19
  ## Usage
22
20
 
23
- ```ruby
24
- 1234.extenso => "MIL DUZENTOS E TRINTA E QUATRO EUROS"
25
- 1234.romana => "MCCXXXIV"
26
- "MCCXXXIV".romana => 1234
27
- 12000000.12.extenso => "DOZE MILHÕES DE EUROS E DOZE CÊNTIMOS"
28
- 1.01.extenso(moeda_singular: 'DÓLAR') => "UM DÓLAR E UM CÊNTIMO"
29
- 14.1.extenso(moeda_plural: 'REAIS') => "CATORZE REAIS E DEZ CÊNTIMOS"
30
- 14.1.extenso(lc: :br) => "QUATORZE REAIS E DEZ CENTAVOS"
31
- 10.01.extenso(fracao_plural: 'CENTAVOS') => "DEZ EUROS E UM CENTAVO" # singular inferido = <plural> menos "S"
32
- 10.10.extenso(fracao_singular: 'CENTAVO') => "DEZ EUROS E DEZ CENTAVOS" # plural inferido = <silgular> mais "S"
33
- 1e10.extenso(lc: :pt) => "DEZ MIL MILHÕES DE EUROS" # portugal usa escala longa
34
- 1e10.extenso(lc: :br) => "DEZ BILHÕES DE REAIS" # brasil usa escala curta
35
- [0.01, 0.2].extenso => ["UM CÊNTIMO","VINTE CÊNTIMOS"]
36
- [4, 5, 6, 7].romana => ["IV", "V", "VI", "VII"]
37
- (1..2).extenso => ["UM EURO","DOIS EUROS"]
38
- (7..9).romana => ["VII", "VIII", "IX"]
39
- {:a=>1, :b=>2}.extenso => {:a=>"UM EURO",:b=>"DOIS EUROS"}
40
- {:a=>[3, 4], :b=>2}.extenso => {:a=>["TRÊS EUROS", "QUATRO EUROS"],:b=>"DOIS EUROS"}
41
- {:a=>["MCMLXVIII", "XIV"], :b=>4}.romana => {:a=>[1968, 14], :b=>"IV"}
42
- ```
21
+ 1234.extenso => 'MIL DUZENTOS E TRINTA E QUATRO EUROS'
22
+ 1234.romana => 'MCCXXXIV'
23
+ 'MCCXXXIV'.romana => 1234
24
+ 12000000.12.extenso => 'DOZE MILHÕES DE EUROS E DOZE CÊNTIMOS'
25
+ 1.01.extenso(moeda_singular: 'DÓLAR') => 'UM DÓLAR E UM CÊNTIMO'
26
+ 14.1.extenso(moeda_plural: 'REAIS') => 'CATORZE REAIS E DEZ CÊNTIMOS'
27
+ 14.1.extenso(lc: :br) => 'QUATORZE REAIS E DEZ CENTAVOS'
28
+ 10.01.extenso(fracao_plural: 'CENTAVOS') => 'DEZ EUROS E UM CENTAVO' # singular inferido = plural menos S
29
+ 10.10.extenso(fracao_singular: 'CENTAVO') => 'DEZ EUROS E DEZ CENTAVOS' # plural inferido = silgular mais S
30
+ 1e10.extenso(lc: :pt) => 'DEZ MIL MILHÕES DE EUROS' # portugal usa escala longa
31
+ 1e10.extenso(lc: :br) => 'DEZ BILHÕES DE REAIS' # brasil usa escala curta
32
+ [0.01, 0.2].extenso => ['UM CÊNTIMO','VINTE CÊNTIMOS']
33
+ [4, 5, 6, 7].romana => ['IV', 'V', 'VI', 'VII']
34
+ (1..2).extenso => ['UM EURO','DOIS EUROS']
35
+ (7..9).romana => ['VII', 'VIII', 'IX']
36
+ {a: 1, b: 2}.extenso => {a: 'UM EURO',b: 'DOIS EUROS'}
37
+ {a: [3, 4], b: 2}.extenso => {a: ['TRÊS EUROS', 'QUATRO EUROS' ],b: 'DOIS EUROS'}
38
+ {a: ['MCMLXVIII', 'XIV'], b: 4}.romana => {a: [1968, 14], b: 'IV'}
43
39
 
44
40
  ## Development
45
41
 
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/gem_tasks'
4
- require 'rake/testtask'
3
+ require('bundler/gem_tasks')
4
+ require('rake/testtask')
5
5
 
6
6
  Rake::TestTask.new(:test) do |t|
7
7
  t.libs << 'test'
@@ -5,22 +5,20 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require('extenso_pt/version')
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = 'extenso_pt'
9
- spec.version = ExtensoPt::VERSION
10
- spec.authors = ['Hernâni Rodrigues Vaz']
11
- spec.email = ['hernanirvaz@gmail.com']
12
- spec.homepage = 'https://github.com/hernanilr/extenso_pt'
13
- spec.license = 'MIT'
8
+ spec.name = 'extenso_pt'
9
+ spec.version = ExtensoPt::VERSION
10
+ spec.authors = ['Hernâni Rodrigues Vaz']
11
+ spec.email = ['hernanirvaz@gmail.com']
12
+ spec.homepage = 'https://github.com/hernanilr/extenso_pt'
13
+ spec.license = 'MIT'
14
+ spec.summary = 'Produz extenso em portugês de portugal, brasil ou numeracao romana.'
15
+ spec.description = "#{spec.summary} Os valores podem ser um numerico, uma string de digitos ou um conjunto destes "\
16
+ 'agrupados em (array, range, hash). O extenso pode ser produzido na escala longa (utilizada em todos os países '\
17
+ 'lusófonos) ou na escala curta (utilizada no Brasil). Pode ainda produzir numeracao romana e vice versa.'
14
18
 
15
- spec.summary = 'Produz extenso em portugês de portugal, brasil ou numeracao romana.'
16
- spec.description = spec.summary
17
- spec.description += ' Os valores podem ser um numerico, uma string de digitos ou um conjunto destes agrupados em '\
18
- '(array, range, hash). O extenso pode ser produzido na escala longa (utilizada em todos os países lusófonos) ou '\
19
- 'na escala curta (utilizada no Brasil). Pode ainda produzir numeracao romana e vice versa.'
20
-
21
- # use "yard" to build full HTML docs.
22
- spec.metadata['yard.run'] = 'yard'
19
+ spec.required_ruby_version = Gem::Requirement.new('~> 2.7')
23
20
  spec.metadata['homepage_uri'] = spec.homepage
21
+ spec.metadata['yard.run'] = 'yard'
24
22
 
25
23
  # Specify which files should be added to the gem when it is released.
26
24
  # loads the files in the RubyGem that have been added into git.
@@ -35,6 +33,10 @@ Gem::Specification.new do |spec|
35
33
  spec.add_development_dependency('bundler')
36
34
  spec.add_development_dependency('minitest')
37
35
  spec.add_development_dependency('rake')
36
+ spec.add_development_dependency('reek')
37
+ spec.add_development_dependency('rubocop')
38
+ spec.add_development_dependency('solargraph')
39
+ spec.add_development_dependency('yard')
38
40
 
39
41
  spec.add_dependency('bigdecimal')
40
42
  end
@@ -1,16 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require('bigdecimal/util')
4
- require('extenso_pt/constantes')
5
- require('extenso_pt/variaveis')
6
4
  require('extenso_pt/extenso')
7
5
  require('extenso_pt/romana')
8
6
  require('extenso_pt/version')
9
7
 
10
8
  # @author Hernani Rodrigues Vaz
11
9
  module ExtensoPt
12
- class Error < StandardError; end
13
- # Produz extenso em portugues de portugal ou brasil a partir de valor numerico
10
+ # expressao regular da numeracao romana
11
+ RO_RE = /^M*(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/i.freeze
12
+ # chaves parametrizacao moeda permitidas
13
+ MOEDA = %i[moeda_singular fracao_singular moeda_plural fracao_plural lc].freeze
14
+ # somente portugues de portugal ou brasil permitidos, qualquer outro locale equivale usar :pt
15
+ EXTLC = %i[pt br].freeze
16
+
17
+ # Processa objeto criando extenso(s) em portugues de portugal ou brasil
14
18
  #
15
19
  # @note valor numerico pode ser uma string digitos
16
20
  # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao
@@ -25,34 +29,14 @@ module ExtensoPt
25
29
  # Hash<extensos> se objecto for (Hash)
26
30
  def extenso(moeda = { lc: :pt })
27
31
  # parametrizar moeda
28
- ExtensoPt.prmo(moeda.parametrizar)
32
+ ExtensoPt.parametrizar_moeda(moeda.parametrizar)
29
33
 
30
34
  processa
31
35
  end
32
36
 
33
- # Processa objeto criando extenso(s) em portugues de portugal ou brasil
34
- #
35
- # @return (see #extenso)
36
- def processa
37
- # converte valores do Hash nos seus extensos
38
- if is_a?(Hash) then transform_values(&:processa)
39
- # converte objecto num Array com os valores convertidos nos seus extensos
40
- elsif respond_to?(:to_a) then to_a.map(&:processa)
41
- else
42
- # converte objeto em string digitos utilizando bigdecimal para
43
- # evitar problemas com aritmetica virgula flutuante em valores >1e12
44
- # valores negativos sao convertidos em positivos
45
- # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos
46
- ExtensoPt.prif(to_d.abs.to_s('F'))
47
-
48
- # processar extenso - valores >= 1e24 sao ignorados
49
- ExtensoPt.cvai.count > 8 ? '' : ExtensoPt.ejun
50
- end
51
- end
52
-
53
37
  # @return [Hash<String, Symbol>] parametrizacao moeda por defeito para :br & inferencias & errados
54
38
  def parametrizar
55
- if value?(:br) && %i[moeda_singular moeda_plural].all? { |e| !keys.include?(e) }
39
+ if value?(:br) && %i[moeda_singular moeda_plural].all? { |syb| !keys.include?(syb) }
56
40
  { lc: :br, moeda_singular: 'REAL', moeda_plural: 'REAIS', fracao_singular: 'CENTAVO', fracao_plural: 'CENTAVOS' }
57
41
  else
58
42
  inferir_singular.eliminar_errados
@@ -61,33 +45,58 @@ module ExtensoPt
61
45
 
62
46
  # @return [Hash<String, Symbol>] parametrizacao moeda singular inferindo do plural
63
47
  def inferir_singular
64
- self[:moeda_singular] ||= (fetch(:moeda_plural, '')[0..-2] if fetch(:moeda_plural, '')[-1] == 'S')
65
- self[:fracao_singular] ||= (fetch(:fracao_plural, '')[0..-2] if fetch(:fracao_plural, '')[-1] == 'S')
48
+ mdp = fetch(:moeda_plural, '')
49
+ frp = fetch(:fracao_plural, '')
50
+ self[:moeda_singular] ||= (mdp[0..-2] if mdp[-1] == 'S')
51
+ self[:fracao_singular] ||= (frp[0..-2] if frp[-1] == 'S')
66
52
  self
67
53
  end
68
54
 
69
55
  # @return [Hash<String, Symbol>] parametrizacao moeda eliminar parametros errados
70
56
  def eliminar_errados
71
- keep_if { |k, v| MOEDA.include?(k) && (k != :lc || EXTLC.include?(v)) }
57
+ keep_if { |key, val| MOEDA.include?(key) && (key != :lc || EXTLC.include?(val)) }
72
58
  end
73
59
 
74
- # @return [true, false] testa se contem numeracao romana
75
- def romana?
76
- is_a?(String) ? RO_RE.match?(upcase) : false
60
+ # @return (see #extenso)
61
+ def processa
62
+ # converte num Array com os valores convertidos nos seus extensos
63
+ return to_a.map(&:processa) if is_a?(Range) || is_a?(Array)
64
+ # converte valores do Hash nos seus extensos
65
+ return transform_values(&:processa) if is_a?(Hash)
66
+
67
+ # converte objeto em string digitos utilizando bigdecimal para
68
+ # evitar problemas com aritmetica virgula flutuante em valores >1e12
69
+ # valores negativos sao convertidos em positivos
70
+ # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos
71
+ ExtensoPt.parametrizar_grupos(to_d.abs.to_s('F'))
72
+
73
+ # processar extenso - valores >= 1e24 sao ignorados
74
+ ExtensoPt.grupos.count > 8 ? '' : ExtensoPt.extenso_completo
77
75
  end
78
76
 
79
77
  # @note valor numerico pode ser uma string digitos
80
78
  # @return [String, Integer] numeracao romana a partir de numerico ou inteiro a partir da numeracao romana
81
79
  def romana
80
+ # converte num Array com os valores convertidos
81
+ return to_a.map(&:romana) if is_a?(Range) || is_a?(Array)
82
82
  # converte os valores do Hash
83
- if is_a?(Hash) then transform_values(&:romana)
84
- # converte objecto num Array com os valores convertidos
85
- elsif respond_to?(:to_a) then to_a.map(&:romana)
83
+ return transform_values(&:romana) if is_a?(Hash)
84
+
85
+ romana_base(to_i.abs)
86
+ end
87
+
88
+ # @return (see #romana)
89
+ def romana_base(inteiro)
86
90
  # numeracao romana a partir de inteiro ou string digitos (ignora parte fracionaria & negativos)
87
- elsif (inteiro = to_i) != 0 then ExtensoPt.ri2r(inteiro.abs)
91
+ return ExtensoPt.ri2r(inteiro) unless inteiro.zero?
92
+
88
93
  # inteiro a partir da numeracao romana
89
- else RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : ''
90
- end
94
+ RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : ''
95
+ end
96
+
97
+ # @return [true, false] testa se contem numeracao romana
98
+ def romana?
99
+ is_a?(String) ? RO_RE.match?(upcase) : false
91
100
  end
92
101
  end
93
102
 
@@ -2,103 +2,170 @@
2
2
 
3
3
  # @author Hernani Rodrigues Vaz
4
4
  module ExtensoPt
5
- # Produz extenso das centenas em portugues de portugal ou brasil
5
+ # extensos 1-19; 20-90; 100-900
6
+ e013a = %w[UM DOIS TRÊS QUATRO CINCO SEIS SETE OITO NOVE DEZ ONZE DOZE TREZE].freeze
7
+ e019a = %w[QUINZE DEZASSEIS DEZASSETE DEZOITO DEZANOVE].freeze
8
+ e090a = %w[VINTE TRINTA QUARENTA CINQUENTA SESSENTA SETENTA OITENTA NOVENTA].freeze
9
+ e900a = %w[CEM CENTO DUZENTOS TREZENTOS QUATROCENTOS QUINHENTOS SEISCENTOS SETECENTOS OITOCENTOS NOVECENTOS].freeze
10
+ A0020 = { pt: [''] + e013a + ['CATORZE'] + e019a, br: [''] + e013a + ['QUATORZE'] + e019a }.freeze
11
+ A0100 = { pt: ['', ''] + e090a, br: ['', ''] + e090a }.freeze
12
+ A1000 = { pt: [''] + e900a, br: [''] + e900a }.freeze
13
+
14
+ # singular extensos 1e3 ate 1e24
15
+ # @note escala segundo convencao entre varios paises,
16
+ # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
17
+ # organizada pelo Bureau International des Poids et Mesures
18
+ # @example
19
+ # 1 000 000 = milhao
20
+ # 1 000 000 000 000 = biliao
21
+ # 1 000 000 000 000 000 000 = triliao
22
+ # 1 000 000 000 000 000 000 000 000 = quadriliao
23
+ # 1 000 000 000 000 000 000 000 000 000 000 = quintiliao
24
+ # 1 000 000 000 000 000 000 000 000 000 000 000 000 = sextiliao
25
+ S1E24 = {
26
+ pt: ['', 'MIL', ' MILHÃO', ' MIL MILHÃO', ' BILIÃO', ' MIL BILIÃO', ' TRILIÃO', ' MIL TRILIÃO'],
27
+ br: ['', 'MIL', ' MILHÃO', ' BILHÃO', ' TRILHÃO', ' QUADRILHÃO', ' QUINTILHÃO', ' SEXTILHÃO']
28
+ }.freeze
29
+
30
+ # plural extensos 1e3 ate 1e24
31
+ # @note escala segundo convencao entre varios paises,
32
+ # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
33
+ # organizada pelo Bureau International des Poids et Mesures
34
+ P1E24 = {
35
+ pt: ['', ' MIL', ' MILHÕES', ' MIL MILHÕES', ' BILIÕES', ' MIL BILIÕES', ' TRILIÕES', ' MIL TRILIÕES'],
36
+ br: ['', ' MIL', ' MILHÕES', ' BILHÕES', ' TRILHÕES', ' QUADRILHÕES', ' QUINTILHÕES', ' SEXTILHÕES']
37
+ }.freeze
38
+
39
+ # Parametrizar variaveis da moeda
6
40
  #
7
- # @param [Integer] mil o valor dum grupo 3 digitos a converter
8
- # @return [String] extenso das centenas
9
- def self.e900(mil)
10
- A1000[@lc][(mil > 100 ? 1 : 0) + mil / 100] + (mil > 100 && (mil % 100).positive? ? ' E ' : '')
41
+ # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao
42
+ # @option moeda [Symbol] :lc locale do extenso - portugues de portugal (:pt) portugues do brasil (:br)
43
+ # @option moeda [String] :moeda_singular moeda no singular
44
+ # @option moeda [String] :fracao_singular fracao no singular
45
+ # @option moeda [String] :moeda_plural moeda no plural
46
+ # @option moeda [String] :fracao_plural fracao no plural
47
+ def self.parametrizar_moeda(moeda)
48
+ # parametrizacao por defeito
49
+ # the first mention of a @<variable> creates that instance variable in the current object ie: self = ExtensoPt
50
+ @lc = moeda[:lc] || :pt
51
+ @ms = moeda[:moeda_singular] || 'EURO'
52
+ @fs = moeda[:fracao_singular] || 'CÊNTIMO'
53
+ @mp = moeda[:moeda_plural] || "#{@ms}S"
54
+ @fp = moeda[:fracao_plural] || "#{@fs}S"
11
55
  end
12
56
 
13
- # Produz extenso das dezenas em portugues de portugal ou brasil
57
+ # Parametrizar variaveis parte inteira e fracionaria
14
58
  #
59
+ # @param [String] digitos do valor monetario a converter
60
+ def self.parametrizar_grupos(digitos)
61
+ # cria array de grupos 3 digitos da parte inteira ex: 123022.12 => [22, 123]
62
+ @ai = digitos[/^\d+/].reverse.scan(/\d{1,3}/).map { |grp| Integer(grp.reverse) }
63
+
64
+ # obtem parte fracionaria da string digitos arredondada a 2 casas decimais ex: 123022.124 => 12, 123022.125 => 13
65
+ @nf = (Float(digitos[/\.\d*/]) * 100).round
66
+ end
67
+
68
+ # @return [Array<Integer>] grupos 3 digitos da parte inteira
69
+ def self.grupos
70
+ @ai
71
+ end
72
+
73
+ # @return [Integer] soma grupos 1-8 de digitos
74
+ def self.soma_grupos
75
+ Integer(@ai[0]) + Integer(@ai[1] || 0) * 2 + Integer(@ai[2..].to_a.inject(:+) || 0) * 2
76
+ end
77
+
78
+ # @return [true, false] sim ou nao proposicao DE
79
+ def self.testa_de?
80
+ Integer(@ai[0..1].inject(:+)).zero? && Integer(@ai[2..].to_a.inject(:+) || 0).positive?
81
+ end
82
+
83
+ # @param [Integer] mil o valor dum grupo 3 digitos a converter
84
+ # @return [String] extenso das centenas em portugues de portugal ou brasil
85
+ def self.centenas(mil)
86
+ cem = mil > 100
87
+ A1000[@lc][(cem ? 1 : 0) + mil / 100] + (cem && (mil % 100).positive? ? ' E ' : '')
88
+ end
89
+
15
90
  # @param [Integer] cem a centena dum grupo 3 digitos a converter
16
- # @return [String] extenso das dezenas
17
- def self.e090(cem)
91
+ # @return [String] extenso das dezenas em portugues de portugal ou brasil
92
+ def self.dezenas(cem)
18
93
  A0100[@lc][cem / 10] + (cem > 20 && (cem % 10).positive? ? ' E ' : '')
19
94
  end
20
95
 
21
- # Produz extenso das unidades em portugues de portugal ou brasil
22
- #
23
96
  # @param [Integer] cem a centena dum grupo 3 digitos a converter
24
- # @return [String] extenso das unidades
25
- def self.e009(cem)
97
+ # @return [String] extenso das unidades em portugues de portugal ou brasil
98
+ def self.unidades(cem)
26
99
  A0020[@lc][cem < 20 ? cem : cem % 10]
27
100
  end
28
101
 
29
- # @return [String] extenso da parte fracionaria em portugues de portugal ou brasil
30
- def self.ef99
31
- if cnf?
32
- e090(@nf) + e009(@nf) + ' ' + (@nf > 1 ? @fp : @fs)
102
+ # @return [String] proposicao E & extenso da parte fracionaria em portugues de portugal ou brasil
103
+ def self.fracionaria
104
+ if @nf.positive?
105
+ "#{soma_grupos.positive? ? ' E ' : ''}#{dezenas(@nf)}#{unidades(@nf)} #{@nf > 1 ? @fp : @fs}"
33
106
  else
34
107
  ''
35
108
  end
36
109
  end
37
110
 
38
111
  # @return [String] final da moeda em portugues de portugal ou brasil
39
- def self.efim
40
- t = c124
41
- if t.positive?
42
- # proposicao DE entre parte inteira e moeda & moeda singular/plural & proposicao E entre moeda e parte fracionaria
43
- (cde? ? ' DE ' : ' ') + (t > 1 ? @mp : @ms) + (cnf? ? ' E ' : '')
112
+ def self.final
113
+ som = soma_grupos
114
+ if som.positive?
115
+ # proposicao DE entre parte inteira e moeda & moeda singular/plural
116
+ "#{testa_de? ? ' DE ' : ' '}#{som > 1 ? @mp : @ms}"
44
117
  else
45
118
  ''
46
- end + ef99
119
+ end + fracionaria
47
120
  end
48
121
 
49
- # Produz proposicao E entre grupos 3 digitos
50
- #
51
122
  # @param [Integer] pos posicao actual nos grupos 3 digitos
52
123
  # @return [String] proposicao E entre grupos 3 digitos
53
- def self.edgs(pos)
54
- if pos.positive? && @ai[pos - 1].positive?
55
- @ai[pos - 1] > 100 ? ' ' : ' E '
124
+ def self.proposicao_grupo(pos)
125
+ grp = @ai[pos - 1]
126
+ if pos.positive? && grp.positive?
127
+ grp > 100 ? ' ' : ' E '
56
128
  else
57
129
  ''
58
130
  end
59
131
  end
60
132
 
61
- # Produz qualificador grupo de 3 digitos em portugues de portugal ou brasil
62
- #
63
133
  # @param [Integer] pos posicao actual nos grupos 3 digitos
64
- # @return [String] qualificador grupo de 3 digitos
65
- def self.e124(pos)
66
- if @ai[pos].positive?
67
- @ai[pos] > 1 ? P1E24[@lc][pos] : S1E24[@lc][pos]
134
+ # @return [String] qualificador grupo de 3 digitos em portugues de portugal ou brasil
135
+ def self.qualificador_grupo(pos)
136
+ grp = @ai[pos]
137
+ if grp.positive?
138
+ grp > 1 ? P1E24[@lc][pos] : S1E24[@lc][pos]
68
139
  else
69
140
  ''
70
- end + edgs(pos)
141
+ end + proposicao_grupo(pos)
71
142
  end
72
143
 
73
- # Produz extenso de grupo 3 digitos em portugues de portugal ou brasil
74
- #
75
144
  # @param [Integer] pos posicao actual nos grupos 3 digitos
76
- # @return [String] extenso do grupo 3 digitos
77
- def self.edg3(pos)
145
+ # @return [String] extenso do grupo 3 digitos em portugues de portugal ou brasil
146
+ def self.extenso_grupo(pos)
147
+ grp = @ai[pos]
148
+ dez = grp % 100
78
149
  # caso especial MIL EUROS
79
- if pos == 1 && @ai[pos] == 1
150
+ if pos == 1 && grp == 1
80
151
  ''
81
152
  else
82
153
  # extenso das centenas + extenso das dezenas + extenso das unidades
83
- e900(@ai[pos]) + e090(@ai[pos] % 100) + e009(@ai[pos] % 100)
84
- end + e124(pos)
154
+ "#{centenas(grp)}#{dezenas(dez)}#{unidades(dez)}"
155
+ end + qualificador_grupo(pos)
85
156
  end
86
157
 
87
- # Produz extenso da parte inteira e fracionaria
88
- #
89
158
  # @param [Integer] pos posicao no grupo 3 digitos
90
159
  # @param [String] ext extenso em construcao
91
- # @return [String] extenso do valor monetario
92
- def self.ejun(pos = 0, ext = '')
160
+ # @return [String] extenso do valor monetario completo
161
+ def self.extenso_completo(pos = 0, ext = '')
93
162
  # testa fim do valor monetario
94
163
  if pos >= @ai.count
95
164
  # caso especial de zero
96
- (c124 + @nf).zero? ? 'ZERO ' + @mp : ext + efim
165
+ (soma_grupos + @nf).zero? ? "ZERO #{@mp}" : "#{ext}#{final}"
97
166
  else
98
167
  # converte grupo 3 digitos na posicao corrente & envoca proxima posicao
99
- ejun(pos + 1, edg3(pos) + ext)
168
+ extenso_completo(pos + 1, extenso_grupo(pos) + ext)
100
169
  end
101
170
  end
102
- # private_class_method :e900, :e090, :e009, :ef99, :efim,
103
- # :edgs, :e124, :edg3
104
171
  end
@@ -2,27 +2,24 @@
2
2
 
3
3
  # @author Hernani Rodrigues Vaz
4
4
  module ExtensoPt
5
- # Produz numeral romano a partir de inteiro
6
- #
5
+ # numeracao romana ordem decrescente (ordem importante)
6
+ ROMAN = { M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 }.freeze
7
+
7
8
  # @param [Integer] inteiro a converter
8
9
  # @return [String] numeral romano do inteiro
9
10
  def self.ri2r(inteiro)
10
11
  return '' if inteiro.zero?
11
12
 
12
- ROMAN.each do |r, v|
13
- return r.to_s + ri2r(inteiro - v) if v <= inteiro
14
- end
13
+ ROMAN.each { |srm, val| return "#{srm}#{ri2r(inteiro - val)}" if val <= inteiro }
15
14
  end
16
15
 
17
- # Produz inteiro a partir de numeral romano
18
- #
19
16
  # @param [String] numeral romano a converter
20
17
  # @param [Integer] ultimo valor convertido
21
18
  # @return [Integer] inteiro do numeral romano
22
19
  def self.rr2i(numeral, ultimo)
23
20
  return 0 if numeral.empty?
24
21
 
25
- v = ROMAN[numeral[-1].to_sym]
26
- rr2i(numeral.chop, v) + (v < ultimo ? -v : v)
22
+ val = ROMAN[numeral[-1].to_sym]
23
+ rr2i(numeral.chop, val) + (val < ultimo ? -val : val)
27
24
  end
28
25
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExtensoPt
4
- VERSION = '0.7.2'
4
+ VERSION = '0.7.7'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: extenso_pt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hernâni Rodrigues Vaz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-29 00:00:00.000000000 Z
11
+ date: 2020-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,62 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: reek
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
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: solargraph
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
55
111
  - !ruby/object:Gem::Dependency
56
112
  name: bigdecimal
57
113
  requirement: !ruby/object:Gem::Requirement
@@ -90,26 +146,24 @@ files:
90
146
  - bin/setup
91
147
  - extenso_pt.gemspec
92
148
  - lib/extenso_pt.rb
93
- - lib/extenso_pt/constantes.rb
94
149
  - lib/extenso_pt/extenso.rb
95
150
  - lib/extenso_pt/romana.rb
96
- - lib/extenso_pt/variaveis.rb
97
151
  - lib/extenso_pt/version.rb
98
152
  homepage: https://github.com/hernanilr/extenso_pt
99
153
  licenses:
100
154
  - MIT
101
155
  metadata:
102
- yard.run: yard
103
156
  homepage_uri: https://github.com/hernanilr/extenso_pt
157
+ yard.run: yard
104
158
  post_install_message:
105
159
  rdoc_options: []
106
160
  require_paths:
107
161
  - lib
108
162
  required_ruby_version: !ruby/object:Gem::Requirement
109
163
  requirements:
110
- - - ">="
164
+ - - "~>"
111
165
  - !ruby/object:Gem::Version
112
- version: '0'
166
+ version: '2.7'
113
167
  required_rubygems_version: !ruby/object:Gem::Requirement
114
168
  requirements:
115
169
  - - ">="
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @author Hernani Rodrigues Vaz
4
- module ExtensoPt
5
- # chaves parametrizacao moeda permitidas
6
- MOEDA = %i[moeda_singular fracao_singular moeda_plural fracao_plural lc].freeze
7
-
8
- # somente portugues de portugal ou brasil permitidos, qualquer outro locale equivale usar :pt
9
- EXTLC = %i[pt br].freeze
10
-
11
- E13 = %w[UM DOIS TRÊS QUATRO CINCO SEIS SETE OITO NOVE DEZ ONZE DOZE TREZE].freeze
12
-
13
- # extensos 1 ate 19
14
- A0020 = {
15
- pt: [''] + E13 + %w[CATORZE QUINZE DEZASSEIS DEZASSETE DEZOITO DEZANOVE],
16
- br: [''] + E13 + %w[QUATORZE QUINZE DEZESSEIS DEZESSETE DEZOITO DEZENOVE]
17
- }.freeze
18
-
19
- # extensos 20 ate 90
20
- A0100 = {
21
- pt: ['', ''] + %w[VINTE TRINTA QUARENTA CINQUENTA SESSENTA SETENTA OITENTA NOVENTA],
22
- br: ['', ''] + %w[VINTE TRINTA QUARENTA CINQUENTA SESSENTA SETENTA OITENTA NOVENTA]
23
- }.freeze
24
-
25
- # extensos 100 ate 900
26
- A1000 = {
27
- pt: [''] + %w[CEM CENTO DUZENTOS TREZENTOS QUATROCENTOS QUINHENTOS SEISCENTOS SETECENTOS OITOCENTOS NOVECENTOS],
28
- br: [''] + %w[CEM CENTO DUZENTOS TREZENTOS QUATROCENTOS QUINHENTOS SEISCENTOS SETECENTOS OITOCENTOS NOVECENTOS]
29
- }.freeze
30
-
31
- # singular extensos 1e3 ate 1e24
32
- # @note escala segundo convencao entre varios paises,
33
- # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
34
- # organizada pelo Bureau International des Poids et Mesures
35
- # @example
36
- # 1 000 000 = milhao
37
- # 1 000 000 000 000 = biliao
38
- # 1 000 000 000 000 000 000 = triliao
39
- # 1 000 000 000 000 000 000 000 000 = quadriliao
40
- # 1 000 000 000 000 000 000 000 000 000 000 = quintiliao
41
- # 1 000 000 000 000 000 000 000 000 000 000 000 000 = sextiliao
42
- S1E24 = {
43
- pt: ['', 'MIL', ' MILHÃO', ' MIL MILHÃO', ' BILIÃO', ' MIL BILIÃO', ' TRILIÃO', ' MIL TRILIÃO'],
44
- br: ['', 'MIL', ' MILHÃO', ' BILHÃO', ' TRILHÃO', ' QUADRILHÃO', ' QUINTILHÃO', ' SEXTILHÃO']
45
- }.freeze
46
-
47
- # plural extensos 1e3 ate 1e24
48
- # @note escala segundo convencao entre varios paises,
49
- # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
50
- # organizada pelo Bureau International des Poids et Mesures
51
- P1E24 = {
52
- pt: ['', ' MIL', ' MILHÕES', ' MIL MILHÕES', ' BILIÕES', ' MIL BILIÕES', ' TRILIÕES', ' MIL TRILIÕES'],
53
- br: ['', ' MIL', ' MILHÕES', ' BILHÕES', ' TRILHÕES', ' QUADRILHÕES', ' QUINTILHÕES', ' SEXTILHÕES']
54
- }.freeze
55
-
56
- # numeracao romana ordem decrescente (ordem importante)
57
- ROMAN = { M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 }.freeze
58
-
59
- # expressao regular da numeracao romana
60
- RO_RE = /^M*(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/i.freeze
61
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # @author Hernani Rodrigues Vaz
4
- module ExtensoPt
5
- # Parametrizar variaveis da moeda
6
- #
7
- # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao
8
- # @option moeda [Symbol] :lc locale do extenso - portugues de portugal (:pt) portugues do brasil (:br)
9
- # @option moeda [String] :moeda_singular moeda no singular
10
- # @option moeda [String] :fracao_singular fracao no singular
11
- # @option moeda [String] :moeda_plural moeda no plural
12
- # @option moeda [String] :fracao_plural fracao no plural
13
- def self.prmo(moeda)
14
- # parametrizacao por defeito
15
- # the first mention of a @<variable> creates that instance variable in the current object ie: self = ExtensoPt
16
- @lc = moeda[:lc] || :pt
17
- @ms = moeda[:moeda_singular] || 'EURO'
18
- @fs = moeda[:fracao_singular] || 'CÊNTIMO'
19
- @mp = moeda[:moeda_plural] || @ms + 'S'
20
- @fp = moeda[:fracao_plural] || @fs + 'S'
21
- end
22
-
23
- # Parametrizar variaveis parte inteira e fracionaria
24
- #
25
- # @param [String] digitos do valor monetario a converter
26
- def self.prif(digitos)
27
- # cria array de grupos 3 digitos da parte inteira ex: 123022.12 => [22, 123]
28
- @ai = digitos[/^\d+/].reverse.scan(/\d{1,3}/).map { |i| Integer(i.reverse) }
29
-
30
- # obtem parte fracionaria da string digitos arredondada a 2 casas decimais ex: 123022.124 => 12, 123022.125 => 13
31
- @nf = (Float(digitos[/\.\d*/]) * 100).round
32
- end
33
-
34
- # @return [Array<Integer>] grupos 3 digitos da parte inteira
35
- def self.cvai
36
- @ai
37
- end
38
-
39
- # @return [Integer] soma grupos 1-8 de digitos
40
- def self.c124
41
- Integer(@ai[0]) + Integer(@ai[1] || 0) * 2 + Integer(@ai[2..].to_a.inject(:+) || 0) * 2
42
- end
43
-
44
- # @return [true, false] sim ou nao para controle proposicao DE
45
- def self.cde?
46
- Integer(@ai[0..1].inject(:+)).zero? && Integer(@ai[2..].to_a.inject(:+) || 0).positive?
47
- end
48
-
49
- # @return [true, false] sim ou nao para controle proposicao E
50
- def self.cnf?
51
- @nf.positive?
52
- end
53
- # private_class_method :c124, :cde?, :cnf?
54
- end