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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

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