You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.3 KiB
158 lines
4.3 KiB
module Extenso
|
|
@@unidade = {
|
|
0 => "zero",
|
|
1 => "um",
|
|
2 => "dois",
|
|
3 => "três",
|
|
4 => "quatro",
|
|
5 => "cinco",
|
|
6 => "seis",
|
|
7 => "sete",
|
|
8 => "oito",
|
|
9 => "nove"
|
|
}
|
|
@@dezena = {
|
|
10 => "dez",
|
|
11 => "onze",
|
|
12 => "doze",
|
|
13 => "treze",
|
|
14 => "quatorze",
|
|
15 => "quinze",
|
|
16 => "dezesseis",
|
|
17 => "dezessete",
|
|
18 => "dezoito",
|
|
19 => "dezenove",
|
|
20 => "vinte",
|
|
30 => "trinta",
|
|
40 => "quarenta",
|
|
50 => "cinquenta",
|
|
60 => "sessenta",
|
|
70 => "setenta",
|
|
80 => "oitenta",
|
|
90 => "noventa" }
|
|
@@centena = {100 => "cento",
|
|
200 => "duzentos",
|
|
300 => "trezentos",
|
|
400 => "quatrocentos",
|
|
500 => "quinhentos",
|
|
600 => "seiscentos",
|
|
700 => "setecentos",
|
|
800 => "oitocentos",
|
|
900 => "novecentos" }
|
|
|
|
# Escreve o numero por extenso.
|
|
#
|
|
# Exemplo:
|
|
# 1.por_extenso ==> 'um'
|
|
# 100.por_extenso ==> 'cem'
|
|
# 158.por_extenso ==> 'cento e cinquenta e oito'
|
|
def por_extenso
|
|
Extenso.por_extenso(self)
|
|
end
|
|
|
|
# DEPRECATION WARNING: use por_extenso, pois este sera removido no proximo release.
|
|
def to_extenso
|
|
warn('DEPRECATION WARNING: use por_extenso, pois este sera removido no proximo release.')
|
|
self.por_extenso
|
|
end
|
|
|
|
# Escreve o numero por extenso.
|
|
#
|
|
# Exemplo:
|
|
# Extenso.por_extenso(1) ==> "um"
|
|
# Extenso.por_extenso(100) ==> "cem"
|
|
# Extenso.por_extenso(158) ==> "cento e cinquenta e oito"
|
|
def Extenso.por_extenso(numero)
|
|
n=numero.to_i.abs
|
|
return case n
|
|
when 0..9: @@unidade[n].to_s
|
|
when 10..19: @@dezena[n].to_s
|
|
when 20..99:
|
|
v=n % 10
|
|
if v== 0
|
|
@@dezena[n].to_s
|
|
else
|
|
"#{@@dezena[n-v]} e #{por_extenso(v)}"
|
|
end
|
|
when 100
|
|
"cem"
|
|
when 101..999
|
|
v=n % 100
|
|
if v== 0
|
|
@@centena[n].to_s
|
|
else
|
|
"#{@@centena[n-v]} e #{por_extenso(v)}"
|
|
end
|
|
when 1000..999999
|
|
m,c=n/1000,n%1000
|
|
%(#{por_extenso(m)} mil#{c > 0 ? " e #{por_extenso(c)}":''})
|
|
when 1_000_000..999_999_999
|
|
mi,m=n/1_000_000,n%1_000_000
|
|
%(#{por_extenso(mi)} milh#{mi > 1 ? 'ões':'ão'}#{m > 0 ? " e #{por_extenso(m)}" : ''})
|
|
when 1_000_000_000..999_999_999_999
|
|
bi,mi=n/1_000_000_000,n%1_000_000_000
|
|
%(#{por_extenso(bi)} bilh#{bi > 1 ? 'ões':'ão'}#{mi > 0 ? " e #{por_extenso(mi)}" : ''})
|
|
when 1_000_000_000_000..999_999_999_999_999
|
|
tri,bi=n/1_000_000_000_000,n%1_000_000_000_000
|
|
%(#{por_extenso(tri)} trilh#{tri > 1 ? 'ões':'ão'}#{bi > 0 ? " e #{por_extenso(bi)}" : ''})
|
|
else
|
|
raise "Valor excede o permitido: #{n}"
|
|
end
|
|
end
|
|
end
|
|
|
|
module ExtensoReal
|
|
include Extenso
|
|
|
|
# Escreve por extenso em reais.
|
|
#
|
|
# Exemplo:
|
|
# 1.por_extenso_em_reais ==> 'um real'
|
|
# (100.58).por_extenso_em_reais ==> 'cem reais e cinquenta e oito centavos'
|
|
def por_extenso_em_reais
|
|
ExtensoReal.por_extenso_em_reais(self.to_s)
|
|
end
|
|
|
|
# DEPRECATION WARNING: use por_extenso_em_reais, pois este sera removido no proximo release.
|
|
def to_extenso_real
|
|
warn('DEPRECATION WARNING: use por_extenso_em_reais, pois este sera removido no proximo release.')
|
|
self.por_extenso_em_reais
|
|
end
|
|
|
|
# Escreve o numero por extenso em reais.
|
|
#
|
|
# Exemplo:
|
|
# Extenso.por_extenso_em_reais(1) ==> "um real"
|
|
# Extenso.por_extenso_em_reais(100) ==> "cem reais"
|
|
# Extenso.por_extenso_em_reais(100.58) ==> "cem reais e cinquenta e oito centavos"
|
|
def ExtensoReal.por_extenso_em_reais(valor)
|
|
return 'grátis' if valor == 0
|
|
case valor
|
|
when Integer
|
|
extenso = Extenso.por_extenso(valor)
|
|
if extenso =~ /^(.*)(ão$|ões$)/
|
|
complemento = 'de '
|
|
else
|
|
complemento = ''
|
|
end
|
|
%(#{extenso} #{valor <= 1 ? 'real': "#{complemento}reais"})
|
|
when Float
|
|
real,cents=("%.2f" % valor).split(/\./).map{ |m| m.to_i}
|
|
valor_cents=Extenso.por_extenso(cents%100)
|
|
|
|
valor_cents+= case cents.to_i%100
|
|
when 0: ""
|
|
when 1: " centavo"
|
|
when 2..99: " centavos"
|
|
end
|
|
|
|
if real.to_i > 0
|
|
"#{ExtensoReal.por_extenso_em_reais(real.to_i)}#{cents > 0 ? ' e ' + valor_cents : ''}"
|
|
else
|
|
"#{valor_cents}"
|
|
end
|
|
else
|
|
ExtensoReal.por_extenso_em_reais(valor.to_s.strip.gsub(/[^\d]/,'.').to_f)
|
|
end
|
|
end
|
|
end |