br-utils 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +120 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +348 -0
  8. data/Rakefile +6 -0
  9. data/examples/boleto_usage_example.rb +79 -0
  10. data/examples/cep_usage_example.rb +148 -0
  11. data/examples/cnh_usage_example.rb +120 -0
  12. data/examples/cnpj_usage_example.rb +227 -0
  13. data/examples/cpf_usage_example.rb +237 -0
  14. data/examples/currency_usage_example.rb +266 -0
  15. data/examples/date_usage_example.rb +259 -0
  16. data/examples/email_usage_example.rb +321 -0
  17. data/examples/legal_nature_usage_example.rb +437 -0
  18. data/examples/legal_process_usage_example.rb +444 -0
  19. data/examples/license_plate_usage_example.rb +440 -0
  20. data/examples/phone_usage_example.rb +595 -0
  21. data/examples/pis_usage_example.rb +588 -0
  22. data/examples/renavam_usage_example.rb +499 -0
  23. data/examples/voter_id_usage_example.rb +573 -0
  24. data/lib/brazilian-utils/boleto-utils.rb +176 -0
  25. data/lib/brazilian-utils/cep-utils.rb +330 -0
  26. data/lib/brazilian-utils/cnh-utils.rb +88 -0
  27. data/lib/brazilian-utils/cnpj-utils.rb +202 -0
  28. data/lib/brazilian-utils/cpf-utils.rb +192 -0
  29. data/lib/brazilian-utils/currency-utils.rb +226 -0
  30. data/lib/brazilian-utils/data/legal_process_ids.json +38 -0
  31. data/lib/brazilian-utils/date-utils.rb +244 -0
  32. data/lib/brazilian-utils/email-utils.rb +54 -0
  33. data/lib/brazilian-utils/legal-nature-utils.rb +235 -0
  34. data/lib/brazilian-utils/legal-process-utils.rb +240 -0
  35. data/lib/brazilian-utils/license-plate-utils.rb +279 -0
  36. data/lib/brazilian-utils/phone-utils.rb +272 -0
  37. data/lib/brazilian-utils/pis-utils.rb +151 -0
  38. data/lib/brazilian-utils/renavam-utils.rb +113 -0
  39. data/lib/brazilian-utils/voter-id-utils.rb +165 -0
  40. metadata +123 -0
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Exemplo de uso do BrazilianUtils::CPFUtils
5
+ # Este arquivo demonstra todas as funcionalidades implementadas
6
+
7
+ require_relative '../lib/brazilian-utils/cpf-utils'
8
+
9
+ puts '=' * 80
10
+ puts 'BrazilianUtils::CPFUtils - Exemplos de Uso'
11
+ puts '=' * 80
12
+ puts
13
+
14
+ # 1. Remover símbolos
15
+ puts '1. REMOVER SÍMBOLOS DE CPF'
16
+ puts '-' * 80
17
+
18
+ dirty_cpfs = [
19
+ '123.456.789-01',
20
+ '987-654-321.01',
21
+ '821.785.374-64'
22
+ ]
23
+
24
+ dirty_cpfs.each do |cpf|
25
+ clean = BrazilianUtils::CPFUtils.remove_symbols(cpf)
26
+ puts "Original: #{cpf.ljust(20)} → Limpo: #{clean}"
27
+ end
28
+ puts
29
+
30
+ # 2. Formatação com display (legacy)
31
+ puts '2. FORMATAÇÃO COM DISPLAY (LEGACY)'
32
+ puts '-' * 80
33
+
34
+ cpfs_to_display = [
35
+ '12345678901',
36
+ '98765432101',
37
+ '00000000000'
38
+ ]
39
+
40
+ cpfs_to_display.each do |cpf|
41
+ formatted = BrazilianUtils::CPFUtils.display(cpf)
42
+ status = formatted ? "✓ #{formatted}" : '✗ nil (inválido)'
43
+ puts "CPF: #{cpf} → #{status}"
44
+ end
45
+ puts
46
+
47
+ # 3. Formatação com format_cpf
48
+ puts '3. FORMATAÇÃO COM FORMAT_CPF'
49
+ puts '-' * 80
50
+
51
+ cpfs_to_format = [
52
+ { cpf: '82178537464', description: 'CPF válido' },
53
+ { cpf: '55550207753', description: 'CPF válido' },
54
+ { cpf: '12345678901', description: 'CPF inválido' }
55
+ ]
56
+
57
+ cpfs_to_format.each do |item|
58
+ formatted = BrazilianUtils::CPFUtils.format_cpf(item[:cpf])
59
+ status = formatted ? "✓ #{formatted}" : '✗ nil (inválido)'
60
+ puts "#{item[:description]}: #{item[:cpf]}"
61
+ puts " Formatado: #{status}"
62
+ end
63
+ puts
64
+
65
+ # 4. Validação de CPF
66
+ puts '4. VALIDAÇÃO DE CPF'
67
+ puts '-' * 80
68
+
69
+ valid_cpfs = [
70
+ '82178537464',
71
+ '55550207753',
72
+ '41840660546',
73
+ '00000000191',
74
+ '00000000272'
75
+ ]
76
+
77
+ puts 'CPFs Válidos:'
78
+ valid_cpfs.each do |cpf|
79
+ is_valid = BrazilianUtils::CPFUtils.valid?(cpf)
80
+ formatted = BrazilianUtils::CPFUtils.format_cpf(cpf)
81
+ status = is_valid ? '✓ Válido' : '✗ Inválido'
82
+ puts " #{formatted} - #{status}"
83
+ end
84
+ puts
85
+
86
+ invalid_cpfs = [
87
+ { cpf: '12345678901', reason: 'Dígitos verificadores incorretos' },
88
+ { cpf: '00000000000', reason: 'Todos os dígitos iguais' },
89
+ { cpf: '11111111111', reason: 'Todos os dígitos iguais' },
90
+ { cpf: '82178537465', reason: 'Último dígito incorreto' },
91
+ { cpf: '82178537454', reason: 'Penúltimo dígito incorreto' }
92
+ ]
93
+
94
+ puts 'CPFs Inválidos:'
95
+ invalid_cpfs.each do |item|
96
+ is_valid = BrazilianUtils::CPFUtils.valid?(item[:cpf])
97
+ status = is_valid ? '✗ ERRO: Foi aceito!' : '✓ Corretamente rejeitado'
98
+ puts " #{item[:cpf]} - #{item[:reason]}"
99
+ puts " #{status}"
100
+ end
101
+ puts
102
+
103
+ # 5. Geração de CPF
104
+ puts '5. GERAÇÃO DE CPF ALEATÓRIO'
105
+ puts '-' * 80
106
+
107
+ puts 'Gerando 10 CPFs aleatórios:'
108
+ 10.times do |i|
109
+ cpf = BrazilianUtils::CPFUtils.generate
110
+ formatted = BrazilianUtils::CPFUtils.format_cpf(cpf)
111
+ is_valid = BrazilianUtils::CPFUtils.valid?(cpf)
112
+ status = is_valid ? '✓' : '✗'
113
+ puts " #{(i + 1).to_s.rjust(2)}. #{formatted} #{status}"
114
+ end
115
+ puts
116
+
117
+ # 6. Workflow completo
118
+ puts '6. WORKFLOW COMPLETO: GERAR → FORMATAR → LIMPAR → VALIDAR'
119
+ puts '-' * 80
120
+
121
+ # Gerar
122
+ cpf = BrazilianUtils::CPFUtils.generate
123
+ puts "1. Gerado: #{cpf}"
124
+
125
+ # Formatar
126
+ formatted = BrazilianUtils::CPFUtils.format_cpf(cpf)
127
+ puts "2. Formatado: #{formatted}"
128
+
129
+ # Simular recebimento de um CPF formatado
130
+ puts "3. Simulando recebimento de CPF formatado: #{formatted}"
131
+
132
+ # Limpar símbolos
133
+ cleaned = BrazilianUtils::CPFUtils.remove_symbols(formatted)
134
+ puts "4. Limpo: #{cleaned}"
135
+
136
+ # Validar
137
+ is_valid = BrazilianUtils::CPFUtils.valid?(cleaned)
138
+ puts "5. Válido? #{is_valid ? '✓ Sim' : '✗ Não'}"
139
+
140
+ # Verificar se é o mesmo CPF original
141
+ puts "6. É o mesmo CPF? #{cleaned == cpf ? '✓ Sim' : '✗ Não'}"
142
+ puts
143
+
144
+ # 7. Testando CPFs com todos os dígitos iguais
145
+ puts '7. TESTANDO CPFs COM TODOS OS DÍGITOS IGUAIS (DEVEM SER INVÁLIDOS)'
146
+ puts '-' * 80
147
+
148
+ (0..9).each do |digit|
149
+ cpf = digit.to_s * 11
150
+ is_valid = BrazilianUtils::CPFUtils.valid?(cpf)
151
+ status = is_valid ? '✗ ERRO: Foi aceito!' : '✓ Corretamente rejeitado'
152
+ puts "CPF #{cpf} - #{status}"
153
+ end
154
+ puts
155
+
156
+ # 8. Casos especiais
157
+ puts '8. CASOS ESPECIAIS'
158
+ puts '-' * 80
159
+
160
+ special_cases = [
161
+ { input: '00000000191', description: 'CPF com zeros à esquerda' },
162
+ { input: '82178537465', description: 'CPF com último dígito errado' },
163
+ { input: '82178537454', description: 'CPF com penúltimo dígito errado' },
164
+ { input: '123456789', description: 'CPF com 9 dígitos (muito curto)' },
165
+ { input: '123456789012', description: 'CPF com 12 dígitos (muito longo)' },
166
+ { input: '821.785.374-64', description: 'CPF com símbolos (deve rejeitar)' }
167
+ ]
168
+
169
+ special_cases.each do |item|
170
+ is_valid = BrazilianUtils::CPFUtils.valid?(item[:input])
171
+ status = is_valid ? '✓ Válido' : '✗ Inválido'
172
+ puts "#{item[:description]}:"
173
+ puts " CPF: #{item[:input]}"
174
+ puts " Status: #{status}"
175
+ end
176
+ puts
177
+
178
+ # 9. Comparação entre métodos (valid? vs validate, format_cpf vs display)
179
+ puts '9. COMPARAÇÃO ENTRE MÉTODOS'
180
+ puts '-' * 80
181
+
182
+ test_cpf = '82178537464'
183
+ puts "CPF de teste: #{test_cpf}"
184
+ puts
185
+ puts 'valid? vs validate:'
186
+ puts " valid?(cpf): #{BrazilianUtils::CPFUtils.valid?(test_cpf)}"
187
+ puts " validate(cpf): #{BrazilianUtils::CPFUtils.validate(test_cpf)}"
188
+ puts
189
+ puts 'format_cpf vs display:'
190
+ puts " format_cpf(cpf): #{BrazilianUtils::CPFUtils.format_cpf(test_cpf)}"
191
+ puts " display(cpf): #{BrazilianUtils::CPFUtils.display(test_cpf)}"
192
+ puts
193
+ puts 'remove_symbols vs sieve:'
194
+ formatted = BrazilianUtils::CPFUtils.format_cpf(test_cpf)
195
+ puts " remove_symbols(formatted): #{BrazilianUtils::CPFUtils.remove_symbols(formatted)}"
196
+ puts " sieve(formatted): #{BrazilianUtils::CPFUtils.sieve(formatted)}"
197
+ puts
198
+
199
+ # 10. Estatísticas de geração
200
+ puts '10. ESTATÍSTICAS DE GERAÇÃO'
201
+ puts '-' * 80
202
+
203
+ puts 'Gerando 100 CPFs e verificando validade...'
204
+ cpfs = 100.times.map { BrazilianUtils::CPFUtils.generate }
205
+ valid_count = cpfs.count { |cpf| BrazilianUtils::CPFUtils.valid?(cpf) }
206
+ unique_count = cpfs.uniq.length
207
+
208
+ puts " Total gerado: 100"
209
+ puts " Válidos: #{valid_count} (#{valid_count}%)"
210
+ puts " Únicos: #{unique_count} (#{unique_count}%)"
211
+ puts " Todos válidos? #{valid_count == 100 ? '✓ Sim' : '✗ Não'}"
212
+ puts " Nenhum começa com 0? #{cpfs.none? { |cpf| cpf[0] == '0' } ? '✓ Sim' : '✗ Não'}"
213
+ puts
214
+
215
+ # 11. Resumo
216
+ puts '11. RESUMO'
217
+ puts '-' * 80
218
+ puts 'A biblioteca CPFUtils oferece:'
219
+ puts ' 1. Remoção de símbolos: remove_symbols() / sieve()'
220
+ puts ' 2. Formatação: format_cpf() / display()'
221
+ puts ' 3. Validação: valid?() / validate()'
222
+ puts ' 4. Geração: generate()'
223
+ puts
224
+ puts 'Regras de validação:'
225
+ puts ' • Deve ter exatamente 11 dígitos'
226
+ puts ' • Não pode ser uma sequência de dígitos iguais'
227
+ puts ' • Os dois últimos dígitos são verificadores calculados'
228
+ puts ' • Deve ser apenas números (sem símbolos)'
229
+ puts
230
+ puts 'Estrutura do CPF: XXX.XXX.XXX-VV'
231
+ puts ' XXX.XXX.XXX = Base (9 dígitos)'
232
+ puts ' VV = Verificadores (2 dígitos)'
233
+ puts
234
+
235
+ puts '=' * 80
236
+ puts 'Exemplos concluídos!'
237
+ puts '=' * 80
@@ -0,0 +1,266 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Exemplo de uso do BrazilianUtils::CurrencyUtils
5
+ # Este arquivo demonstra todas as funcionalidades implementadas
6
+
7
+ require_relative '../lib/brazilian-utils/currency-utils'
8
+
9
+ puts '=' * 80
10
+ puts 'BrazilianUtils::CurrencyUtils - Exemplos de Uso'
11
+ puts '=' * 80
12
+ puts
13
+
14
+ # 1. Formatação de moeda
15
+ puts '1. FORMATAÇÃO DE MOEDA (format_currency)'
16
+ puts '-' * 80
17
+
18
+ values_to_format = [
19
+ 1234.56,
20
+ 0,
21
+ -9876.54,
22
+ 1000,
23
+ 0.50,
24
+ 1234567.89,
25
+ 1234567890.12,
26
+ '2500.75',
27
+ 10.5
28
+ ]
29
+
30
+ values_to_format.each do |value|
31
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
32
+ puts "#{value.to_s.rjust(15)} → #{formatted}"
33
+ end
34
+ puts
35
+
36
+ # 2. Valores inválidos na formatação
37
+ puts '2. VALORES INVÁLIDOS NA FORMATAÇÃO'
38
+ puts '-' * 80
39
+
40
+ invalid_values = ['invalid', nil, 'abc']
41
+
42
+ invalid_values.each do |value|
43
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
44
+ puts "#{value.inspect.rjust(15)} → #{formatted.inspect}"
45
+ end
46
+ puts
47
+
48
+ # 3. Conversão para texto - Valores simples
49
+ puts '3. CONVERSÃO PARA TEXTO - VALORES SIMPLES'
50
+ puts '-' * 80
51
+
52
+ simple_values = [
53
+ { value: 0.00, description: 'Zero' },
54
+ { value: 1.00, description: 'Um real' },
55
+ { value: 2.00, description: 'Dois reais' },
56
+ { value: 10.00, description: 'Dez reais' },
57
+ { value: 100.00, description: 'Cem reais' },
58
+ { value: 1000.00, description: 'Mil reais' }
59
+ ]
60
+
61
+ simple_values.each do |item|
62
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:value])
63
+ puts "R$ #{format('%10.2f', item[:value])} → #{text}"
64
+ end
65
+ puts
66
+
67
+ # 4. Conversão para texto - Apenas centavos
68
+ puts '4. CONVERSÃO PARA TEXTO - APENAS CENTAVOS'
69
+ puts '-' * 80
70
+
71
+ centavos_values = [0.01, 0.50, 0.99, 0.25, 0.75]
72
+
73
+ centavos_values.each do |value|
74
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(value)
75
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
76
+ puts "#{formatted.rjust(12)} → #{text}"
77
+ end
78
+ puts
79
+
80
+ # 5. Conversão para texto - Reais e centavos
81
+ puts '5. CONVERSÃO PARA TEXTO - REAIS E CENTAVOS'
82
+ puts '-' * 80
83
+
84
+ mixed_values = [1.50, 2.01, 10.99, 1523.45, 100.50]
85
+
86
+ mixed_values.each do |value|
87
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(value)
88
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
89
+ puts "#{formatted}"
90
+ puts " → #{text}"
91
+ puts
92
+ end
93
+
94
+ # 6. Conversão para texto - Valores grandes
95
+ puts '6. CONVERSÃO PARA TEXTO - VALORES GRANDES'
96
+ puts '-' * 80
97
+
98
+ large_values = [
99
+ { value: 1_000_000.00, description: '1 Milhão' },
100
+ { value: 2_000_000.00, description: '2 Milhões' },
101
+ { value: 1_000_000_000.00, description: '1 Bilhão' },
102
+ { value: 1_234_567.89, description: '1.2 Milhões com centavos' }
103
+ ]
104
+
105
+ large_values.each do |item|
106
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:value])
107
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(item[:value])
108
+ puts "#{item[:description]}:"
109
+ puts " Numérico: #{formatted}"
110
+ puts " Extenso: #{text}"
111
+ puts
112
+ end
113
+
114
+ # 7. Valores negativos
115
+ puts '7. VALORES NEGATIVOS'
116
+ puts '-' * 80
117
+
118
+ negative_values = [-10.50, -0.50, -1000.00, -1523.45]
119
+
120
+ negative_values.each do |value|
121
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(value)
122
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
123
+ puts "#{formatted}"
124
+ puts " → #{text}"
125
+ puts
126
+ end
127
+
128
+ # 8. Arredondamento (round down)
129
+ puts '8. ARREDONDAMENTO (VALORES TRUNCADOS PARA 2 CASAS)'
130
+ puts '-' * 80
131
+
132
+ rounding_values = [
133
+ { value: 1.999, expected_text: '1.99' },
134
+ { value: 0.555, expected_text: '0.55' },
135
+ { value: 10.12345, expected_text: '10.12' }
136
+ ]
137
+
138
+ rounding_values.each do |item|
139
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:value])
140
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(item[:value])
141
+ puts "Valor original: #{item[:value]}"
142
+ puts " Formatado: #{formatted}"
143
+ puts " Extenso: #{text}"
144
+ puts
145
+ end
146
+
147
+ # 9. Casos especiais de números
148
+ puts '9. CASOS ESPECIAIS DE NÚMEROS'
149
+ puts '-' * 80
150
+
151
+ special_numbers = [11.00, 15.00, 20.00, 21.00, 101.00, 200.00, 1000.00]
152
+
153
+ special_numbers.each do |value|
154
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(value)
155
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
156
+ puts "#{formatted.rjust(15)} → #{text}"
157
+ end
158
+ puts
159
+
160
+ # 10. Workflow completo: Emissão de cheque
161
+ puts '10. WORKFLOW COMPLETO: EMISSÃO DE CHEQUE'
162
+ puts '-' * 80
163
+
164
+ cheque_value = 1523.45
165
+
166
+ puts 'Dados do Cheque:'
167
+ puts '-' * 40
168
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(cheque_value)
169
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(cheque_value)
170
+
171
+ puts "Valor numérico: #{formatted}"
172
+ puts "Valor por extenso:"
173
+ puts " #{text}"
174
+ puts
175
+
176
+ # 11. Workflow completo: Nota fiscal
177
+ puts '11. WORKFLOW COMPLETO: NOTA FISCAL'
178
+ puts '-' * 80
179
+
180
+ items = [
181
+ { name: 'Produto A', price: 150.00 },
182
+ { name: 'Produto B', price: 75.50 },
183
+ { name: 'Produto C', price: 1200.00 }
184
+ ]
185
+
186
+ puts 'NOTA FISCAL'
187
+ puts '-' * 40
188
+ total = 0
189
+
190
+ items.each do |item|
191
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(item[:price])
192
+ puts "#{item[:name].ljust(12)} #{formatted.rjust(15)}"
193
+ total += item[:price]
194
+ end
195
+
196
+ puts '-' * 40
197
+ total_formatted = BrazilianUtils::CurrencyUtils.format_currency(total)
198
+ total_text = BrazilianUtils::CurrencyUtils.convert_real_to_text(total)
199
+ puts "#{'TOTAL'.ljust(12)} #{total_formatted.rjust(15)}"
200
+ puts
201
+ puts 'Valor por extenso:'
202
+ puts " #{total_text}"
203
+ puts
204
+
205
+ # 12. Testes com diferentes tipos de entrada
206
+ puts '12. DIFERENTES TIPOS DE ENTRADA'
207
+ puts '-' * 80
208
+
209
+ different_inputs = [
210
+ { input: 100, type: 'Integer' },
211
+ { input: 100.50, type: 'Float' },
212
+ { input: '100.50', type: 'String' },
213
+ { input: BigDecimal('100.50'), type: 'BigDecimal' }
214
+ ]
215
+
216
+ different_inputs.each do |item|
217
+ formatted = BrazilianUtils::CurrencyUtils.format_currency(item[:input])
218
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:input])
219
+ puts "Tipo: #{item[:type].ljust(12)} Input: #{item[:input].inspect}"
220
+ puts " Formatado: #{formatted}"
221
+ puts " Extenso: #{text}"
222
+ puts
223
+ end
224
+
225
+ # 13. Valores inválidos na conversão
226
+ puts '13. VALORES INVÁLIDOS NA CONVERSÃO PARA TEXTO'
227
+ puts '-' * 80
228
+
229
+ invalid_for_text = [
230
+ { value: 'invalid', description: 'String inválida' },
231
+ { value: nil, description: 'Nil' },
232
+ { value: 1_000_000_000_000_001.00, description: 'Acima do limite (1 quadrilhão)' }
233
+ ]
234
+
235
+ invalid_for_text.each do |item|
236
+ text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:value])
237
+ puts "#{item[:description]}: #{item[:value].inspect}"
238
+ puts " Resultado: #{text.inspect}"
239
+ end
240
+ puts
241
+
242
+ # 14. Resumo
243
+ puts '14. RESUMO'
244
+ puts '-' * 80
245
+ puts 'A biblioteca CurrencyUtils oferece:'
246
+ puts ' 1. format_currency(value): Formata valores em moeda brasileira (R$)'
247
+ puts ' 2. convert_real_to_text(amount): Converte valores para extenso em português'
248
+ puts
249
+ puts 'Características da formatação:'
250
+ puts ' • Separador de milhares: . (ponto)'
251
+ puts ' • Separador decimal: , (vírgula)'
252
+ puts ' • Sempre 2 casas decimais'
253
+ puts ' • Suporta valores negativos'
254
+ puts ' • Suporta números muito grandes'
255
+ puts
256
+ puts 'Características da conversão para texto:'
257
+ puts ' • Valores arredondados para baixo (truncados) em 2 casas decimais'
258
+ puts ' • Máximo: 1 quadrilhão de reais'
259
+ puts ' • Português gramaticalmente correto (singular/plural)'
260
+ puts ' • Conectores adequados para milhões/bilhões'
261
+ puts ' • Valores negativos com prefixo "Menos"'
262
+ puts
263
+
264
+ puts '=' * 80
265
+ puts 'Exemplos concluídos!'
266
+ puts '=' * 80