#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Números por extenso, cardinais, ordinais e cardinais com unidades de medida
Compatível com as versões 2 e 3 do Python
'''
from __future__ import division, print_function, unicode_literals
from decimal import Decimal as D
PLURAL = 1
SINGULAR = 0
CARDINAL = 1
ORDINAL = 0
MASCULINO = 1
FEMININO = 0
#
# Número cardinais
#
CARDINAL_0 = 'zero'
CARDINAL_1 = 'um'
CARDINAL_2 = 'dois'
CARDINAL_3 = 'três'
CARDINAL_4 = 'quatro'
CARDINAL_5 = 'cinco'
CARDINAL_6 = 'seis'
CARDINAL_7 = 'sete'
CARDINAL_8 = 'oito'
CARDINAL_9 = 'nove'
CARDINAL_10 = 'dez'
CARDINAL_11 = 'onze'
CARDINAL_12 = 'doze'
CARDINAL_13 = 'treze'
CARDINAL_14 = 'catorze'
CARDINAL_15 = 'quinze'
CARDINAL_16 = 'dezesseis'
CARDINAL_17 = 'dezessete'
CARDINAL_18 = 'dezoito'
CARDINAL_19 = 'dezenove'
CARDINAL_20 = 'vinte'
CARDINAL_30 = 'trinta'
CARDINAL_40 = 'quarenta'
CARDINAL_50 = 'cinquenta'
CARDINAL_60 = 'sessenta'
CARDINAL_70 = 'setenta'
CARDINAL_80 = 'oitenta'
CARDINAL_90 = 'noventa'
CARDINAL_100_ISOLADO = 'cem'
CARDINAL_100 = 'cento'
CARDINAL_200 = 'duzentos'
CARDINAL_300 = 'trezentos'
CARDINAL_400 = 'quatrocentos'
CARDINAL_500 = 'quinhentos'
CARDINAL_600 = 'seiscentos'
CARDINAL_700 = 'setecentos'
CARDINAL_800 = 'oitocentos'
CARDINAL_900 = 'novecentos'
CARDINAL_1_FEMININO = 'uma'
CARDINAL_2_FEMININO = 'duas'
CARDINAL_200_FEMININO = 'duzentas'
CARDINAL_300_FEMININO = 'trezentas'
CARDINAL_400_FEMININO = 'quatrocentas'
CARDINAL_500_FEMININO = 'quinhentas'
CARDINAL_600_FEMININO = 'seiscentas'
CARDINAL_700_FEMININO = 'setecentas'
CARDINAL_800_FEMININO = 'oitocentas'
CARDINAL_900_FEMININO = 'novecentas'
CARDINAL_MASCULINO = {
0: CARDINAL_0,
1: CARDINAL_1,
2: CARDINAL_2,
3: CARDINAL_3,
4: CARDINAL_4,
5: CARDINAL_5,
6: CARDINAL_6,
7: CARDINAL_7,
8: CARDINAL_8,
9: CARDINAL_9,
10: CARDINAL_10,
11: CARDINAL_11,
12: CARDINAL_12,
13: CARDINAL_13,
14: CARDINAL_14,
15: CARDINAL_15,
16: CARDINAL_16,
17: CARDINAL_17,
18: CARDINAL_18,
19: CARDINAL_19,
20: CARDINAL_20,
30: CARDINAL_30,
40: CARDINAL_40,
50: CARDINAL_50,
60: CARDINAL_60,
70: CARDINAL_70,
80: CARDINAL_80,
90: CARDINAL_90,
100: CARDINAL_100,
200: CARDINAL_200,
300: CARDINAL_300,
400: CARDINAL_400,
500: CARDINAL_500,
600: CARDINAL_600,
700: CARDINAL_700,
800: CARDINAL_800,
900: CARDINAL_900,
}
CARDINAL_FEMININO = CARDINAL_MASCULINO.copy()
CARDINAL_FEMININO.update({
1: CARDINAL_1_FEMININO,
2: CARDINAL_2_FEMININO,
200: CARDINAL_200_FEMININO,
300: CARDINAL_300_FEMININO,
400: CARDINAL_400_FEMININO,
500: CARDINAL_500_FEMININO,
600: CARDINAL_600_FEMININO,
700: CARDINAL_700_FEMININO,
800: CARDINAL_800_FEMININO,
900: CARDINAL_900_FEMININO,
})
NOME_CARDINAL_POTENCIA = {
10**3: ('mil', 'mil'),
10**6: ('milhão', 'milhões'),
10**9: ('bilhão', 'bilhões'),
10**12: ('trilhão', 'trilhões'),
10**15: ('quatrilhão', 'quatrilhões'),
10**18: ('quintilhão', 'quintilhões'),
10**21: ('sextilhão', 'sextilhões'),
10**24: ('setilhão', 'setilhões'),
10**27: ('octilhão', 'octilhões'),
10**30: ('nonilhão', 'nonilhões'),
10**33: ('decilhão', 'decilhões'),
10**36: ('undecilhão', 'undecilhões'),
10**39: ('dodecilhão', 'duodecilhões'),
10**42: ('tredecilhão', 'tredecilhões'),
10**45: ('quatuordecilhão', 'quatuordecilhões'),
10**48: ('quindecilhão', 'quindecilhões'),
10**51: ('sesdecilhão', 'sesdecilhões'),
10**54: ('septendecilhão', 'septendecilhões'),
10**57: ('octodecilhão', 'octodecilhões'),
10**60: ('nonidecilhão', 'nonidecilhões'),
}
#
# Número ordinais
#
ORDINAL_1 = 'primeiro'
ORDINAL_2 = 'segundo'
ORDINAL_3 = 'terceiro'
ORDINAL_4 = 'quarto'
ORDINAL_5 = 'quinto'
ORDINAL_6 = 'sexto'
ORDINAL_7 = 'sétimo'
ORDINAL_8 = 'oitavo'
ORDINAL_9 = 'nono'
ORDINAL_10 = 'décimo'
ORDINAL_11 = ORDINAL_10 + ' ' + ORDINAL_1
ORDINAL_12 = ORDINAL_10 + ' ' + ORDINAL_2
ORDINAL_13 = ORDINAL_10 + ' ' + ORDINAL_3
ORDINAL_14 = ORDINAL_10 + ' ' + ORDINAL_4
ORDINAL_15 = ORDINAL_10 + ' ' + ORDINAL_5
ORDINAL_16 = ORDINAL_10 + ' ' + ORDINAL_6
ORDINAL_17 = ORDINAL_10 + ' ' + ORDINAL_7
ORDINAL_18 = ORDINAL_10 + ' ' + ORDINAL_8
ORDINAL_19 = ORDINAL_10 + ' ' + ORDINAL_9
ORDINAL_20 = 'vigésimo'
ORDINAL_30 = 'trigésimo'
ORDINAL_40 = 'quadragésimo'
ORDINAL_50 = 'quinquagésimo'
ORDINAL_60 = 'sexagésimo'
ORDINAL_70 = 'septuagésimo'
ORDINAL_80 = 'octogésimo'
ORDINAL_90 = 'nonagésimo'
ORDINAL_100 = 'centésimo'
ORDINAL_200 = 'ducentésimo'
ORDINAL_300 = 'tricentésimo'
ORDINAL_400 = 'quadringentésimo'
ORDINAL_500 = 'quingentésimo'
ORDINAL_600 = 'seiscentésimo'
ORDINAL_700 = 'septigentésimo'
ORDINAL_800 = 'octingentésimo'
ORDINAL_900 = 'noningentésimo'
ORDINAL_1_FEMININO = 'primeira'
ORDINAL_2_FEMININO = 'segunda'
ORDINAL_3_FEMININO = 'terceira'
ORDINAL_4_FEMININO = 'quarta'
ORDINAL_5_FEMININO = 'quinta'
ORDINAL_6_FEMININO = 'sexta'
ORDINAL_7_FEMININO = 'sétima'
ORDINAL_8_FEMININO = 'oitava'
ORDINAL_9_FEMININO = 'nona'
ORDINAL_10_FEMININO = 'décima'
ORDINAL_11_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_1_FEMININO
ORDINAL_12_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_2_FEMININO
ORDINAL_13_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_3_FEMININO
ORDINAL_14_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_4_FEMININO
ORDINAL_15_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_5_FEMININO
ORDINAL_16_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_6_FEMININO
ORDINAL_17_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_7_FEMININO
ORDINAL_18_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_8_FEMININO
ORDINAL_19_FEMININO = ORDINAL_10_FEMININO + ' ' + ORDINAL_9_FEMININO
ORDINAL_20_FEMININO = 'vigésima'
ORDINAL_30_FEMININO = 'trigésima'
ORDINAL_40_FEMININO = 'quadragésima'
ORDINAL_50_FEMININO = 'quinquagésima'
ORDINAL_60_FEMININO = 'sexagésima'
ORDINAL_70_FEMININO = 'septuagésima'
ORDINAL_80_FEMININO = 'octogésima'
ORDINAL_90_FEMININO = 'nonagésima'
ORDINAL_100_FEMININO = 'centésima'
ORDINAL_200_FEMININO = 'ducentésima'
ORDINAL_300_FEMININO = 'tricentésima'
ORDINAL_400_FEMININO = 'quadringentésima'
ORDINAL_500_FEMININO = 'quingentésima'
ORDINAL_600_FEMININO = 'seiscentésima'
ORDINAL_700_FEMININO = 'septigentésima'
ORDINAL_800_FEMININO = 'octingentésima'
ORDINAL_900_FEMININO = 'noningentésima'
ORDINAL_MASCULINO = {
0: CARDINAL_0,
1: ORDINAL_1,
2: ORDINAL_2,
3: ORDINAL_3,
4: ORDINAL_4,
5: ORDINAL_5,
6: ORDINAL_6,
7: ORDINAL_7,
8: ORDINAL_8,
9: ORDINAL_9,
10: ORDINAL_10,
11: ORDINAL_11,
12: ORDINAL_12,
13: ORDINAL_13,
14: ORDINAL_14,
15: ORDINAL_15,
16: ORDINAL_16,
17: ORDINAL_17,
18: ORDINAL_18,
19: ORDINAL_19,
20: ORDINAL_20,
30: ORDINAL_30,
40: ORDINAL_40,
50: ORDINAL_50,
60: ORDINAL_60,
70: ORDINAL_70,
80: ORDINAL_80,
90: ORDINAL_90,
100: ORDINAL_100,
200: ORDINAL_200,
300: ORDINAL_300,
400: ORDINAL_400,
500: ORDINAL_500,
600: ORDINAL_600,
700: ORDINAL_700,
800: ORDINAL_800,
900: ORDINAL_900,
}
ORDINAL_FEMININO = {
0: CARDINAL_0,
1: ORDINAL_1_FEMININO,
2: ORDINAL_2_FEMININO,
3: ORDINAL_3_FEMININO,
4: ORDINAL_4_FEMININO,
5: ORDINAL_5_FEMININO,
6: ORDINAL_6_FEMININO,
7: ORDINAL_7_FEMININO,
8: ORDINAL_8_FEMININO,
9: ORDINAL_9_FEMININO,
10: ORDINAL_10_FEMININO,
11: ORDINAL_11_FEMININO,
12: ORDINAL_12_FEMININO,
13: ORDINAL_13_FEMININO,
14: ORDINAL_14_FEMININO,
15: ORDINAL_15_FEMININO,
16: ORDINAL_16_FEMININO,
17: ORDINAL_17_FEMININO,
18: ORDINAL_18_FEMININO,
19: ORDINAL_19_FEMININO,
20: ORDINAL_20_FEMININO,
30: ORDINAL_30_FEMININO,
40: ORDINAL_40_FEMININO,
50: ORDINAL_50_FEMININO,
60: ORDINAL_60_FEMININO,
70: ORDINAL_70_FEMININO,
80: ORDINAL_80_FEMININO,
90: ORDINAL_90_FEMININO,
100: ORDINAL_100_FEMININO,
200: ORDINAL_200_FEMININO,
300: ORDINAL_300_FEMININO,
400: ORDINAL_400_FEMININO,
500: ORDINAL_500_FEMININO,
600: ORDINAL_600_FEMININO,
700: ORDINAL_700_FEMININO,
800: ORDINAL_800_FEMININO,
900: ORDINAL_900_FEMININO,
}
NOME_ORDINAL_POTENCIA_MASCULINO = {
10**3: ('milésimo', 'milésimo'),
10**6: ('milionésimo', 'milionésimo'),
10**9: ('bilionésimo', 'bilionésimo'),
10**12: ('trilionésimo', 'trilionésimo'),
10**15: ('quatrilionésimo', 'quatrilionésimo'),
10**18: ('quintilionésimo', 'quitilionésimo'),
10**21: ('sextilionésimo', 'sextilionésimo'),
10**24: ('setilionésimo', 'setilionésimo'),
10**27: ('octilionésimo', 'octilionésimo'),
10**30: ('nonilionésimo', 'nonilionésimo'),
10**33: ('decilionésimo', 'decilionésimo'),
10**36: ('undecilionésimo', 'undecilionésimo'),
10**39: ('dodecilionésimo', 'duodecilionésimo'),
10**42: ('tredecilionésimo', 'tredecilionésimo'),
10**45: ('quatuordecilionésimo', 'quatuordecilionésimo'),
10**48: ('quindecilionésimo', 'quindecilionésimo'),
10**51: ('sesdecilionésimo', 'sesdecilionésimo'),
10**54: ('septendecilionésimo', 'septendecilionésimo'),
10**57: ('octodecilionésimo', 'octodecilionésimo'),
10**60: ('nonidecilionésimo', 'nonidecilionésimo'),
}
NOME_ORDINAL_POTENCIA_FEMININO = {
10**3: ('milésima', 'milésima'),
10**6: ('milionésima', 'milionésima'),
10**9: ('bilionésima', 'bilionésima'),
10**12: ('trilionésima', 'trilionésima'),
10**15: ('quatrilionésima', 'quatrilionésima'),
10**18: ('quintilionésima', 'quitilionésima'),
10**21: ('sextilionésima', 'sextilionésima'),
10**24: ('setilionésima', 'setilionésima'),
10**27: ('octilionésima', 'octilionésima'),
10**30: ('nonilionésima', 'nonilionésima'),
10**33: ('decilionésima', 'decilionésima'),
10**36: ('undecilionésima', 'undecilionésima'),
10**39: ('dodecilionésima', 'duodecilionésima'),
10**42: ('tredecilionésima', 'tredecilionésima'),
10**45: ('quatuordecilionésima', 'quatuordecilionésima'),
10**48: ('quindecilionésima', 'quindecilionésima'),
10**51: ('sesdecilionésima', 'sesdecilionésima'),
10**54: ('septendecilionésima', 'septendecilionésima'),
10**57: ('octodecilionésima', 'octodecilionésima'),
10**60: ('nonidecilionésima', 'nonidecilionésima'),
}
EXTENSO = {
CARDINAL: {
MASCULINO: CARDINAL_MASCULINO,
FEMININO: CARDINAL_FEMININO,
},
ORDINAL: {
MASCULINO: ORDINAL_MASCULINO,
FEMININO: ORDINAL_FEMININO,
}
}
NOME_POTENCIA = {
CARDINAL: {
MASCULINO: NOME_CARDINAL_POTENCIA,
FEMININO: NOME_CARDINAL_POTENCIA,
},
ORDINAL: {
MASCULINO: NOME_ORDINAL_POTENCIA_MASCULINO,
FEMININO: NOME_ORDINAL_POTENCIA_FEMININO,
}
}
VALOR_MAXIMO = max(NOME_CARDINAL_POTENCIA)
class NumeroPorExtenso(object):
def __init__(self, numero=0, unidade=('real', 'reais'), genero_unidade_masculino=True,
precisao_decimal=2, unidade_decimal=('centavo', 'centavos'),
genero_unidade_decimal_masculino=True, mascara_negativo=('menos %s', 'menos %s'),
fator_relacao_decimal=1):
self.numero = numero
self.unidade = unidade
self.genero_unidade_masculino = genero_unidade_masculino
self.precisao_decimal = precisao_decimal
self.fator_relacao_decimal = fator_relacao_decimal
self.unidade_decimal = unidade_decimal
self.genero_unidade_decimal_masculino = genero_unidade_decimal_masculino
self.mascara_negativo = mascara_negativo
def get_numero(self):
return self._numero
def set_numero(self, valor):
if D(str(valor)) > VALOR_MAXIMO:
raise OverflowError('valor maior do que o máximo permitido: %s' % VALOR_MAXIMO)
self._numero = D(str(valor))
numero = property(get_numero, set_numero)
def get_fator_relacao_decimal(self):
return self._fator_relacao_decimal
def set_fator_relacao_decimal(self, valor):
self._fator_relacao_decimal = D(str(valor))
fator_relacao_decimal = property(get_fator_relacao_decimal, set_fator_relacao_decimal)
def _centena_dezena_unidade(self, numero, tipo=CARDINAL, genero=MASCULINO):
assert 0 <= numero < 1000
#
# Tratamento especial do número 100
#
if (numero == 100) and (tipo == CARDINAL):
return CARDINAL_100_ISOLADO
if numero in EXTENSO[tipo][genero]:
return EXTENSO[tipo][genero][numero]
potencia_10 = int(10 ** int(D(numero).log10()))
cabeca = int(numero / potencia_10) * potencia_10
corpo = int(numero % potencia_10)
if tipo == CARDINAL:
return EXTENSO[tipo][genero][cabeca] + ' e ' + self._centena_dezena_unidade(corpo, tipo, genero)
else:
return EXTENSO[tipo][genero][cabeca] + ' ' + self._centena_dezena_unidade(corpo, tipo, genero)
def _potencia(self, numero, tipo=CARDINAL, genero=MASCULINO):
potencia_10 = 1000 ** int((len(str(int(numero))) - 1) / 3)
if potencia_10 <= 100:
return self._centena_dezena_unidade(numero, tipo, genero)
este_grupo = int(numero / potencia_10)
proximo_grupo = numero - (este_grupo * potencia_10)
#
# Tratamento especial para o número 1.000:
# cardinais:
# um mil -> mil
# uma mil -> mil
#
if (tipo == CARDINAL) and (potencia_10 == 1000) and (este_grupo == 1):
texto = ''
#
# Tratamento especial para os números 1.000, 1.000.000 etc.
# ordinais:
# primeiro milésimo -> milésimo
# primeira milésima -> milésima
# primeiro milionésimo -> milionésimo
# primeira milionésima -> milionésima
#
elif (tipo == ORDINAL) and (potencia_10 >= 1000) and (este_grupo == 1):
texto = ''
else:
#
# Nos número cardinais, o gênero feminino só é usado até os milhares
#
if (tipo == CARDINAL) and (potencia_10 > 1000):
texto = self._centena_dezena_unidade(este_grupo, tipo, MASCULINO)
else:
texto = self._centena_dezena_unidade(este_grupo, tipo, genero)
if len(texto):
texto += ' '
texto += NOME_POTENCIA[tipo][genero][potencia_10][este_grupo > 1]
#
# Conexão entre os grupos
#
if proximo_grupo > 0:
if (tipo == CARDINAL) and ((proximo_grupo <= 100) or (proximo_grupo in EXTENSO[tipo][genero])):
texto += ' e '
elif (tipo == CARDINAL) and (potencia_10 != 1000):
texto += ', '
else:
texto += ' '
texto += self._potencia(proximo_grupo, tipo, genero)
return texto
def get_extenso_cardinal(self):
'''
Número cardinal sem unidade, somente a parte inteira, somente números positivos
'''
return self._potencia(abs(int(self.numero)), tipo=CARDINAL, genero=MASCULINO)
extenso_cardinal = property(get_extenso_cardinal)
def get_extenso_ordinal(self):
'''
Número ordinal sem unidade, considerando o gênero da unidade
'''
if self._numero == 0:
return ''
return self._potencia(abs(int(self.numero)), tipo=ORDINAL, genero=self.genero_unidade_masculino)
extenso_ordinal = property(get_extenso_ordinal)
def get_extenso_unidade(self):
'''
Número ordinal com unidade, parte inteira e decimal, com tratamento de negativos
'''
#
# Tratamento do zero, cuja unidade é sempre no plural: zero reais, zero graus etc.
#
if self.numero == 0:
texto = CARDINAL_0
if len(self.unidade[PLURAL]):
texto += ' ' + self.unidade[PLURAL]
return texto
#
# Separação da parte decimal com a precisão desejada
#
negativo = self.numero < 0
numero = abs(self.numero)
inteiro = int(numero)
decimal = int(((numero - inteiro) * self.fator_relacao_decimal) * (10 ** self.precisao_decimal))
#
# Extenso da parte inteira
#
if inteiro > 0:
texto_inteiro = self._potencia(inteiro, genero=self.genero_unidade_masculino)
if (inteiro == 1) and (len(self.unidade[SINGULAR])):
texto_inteiro += ' ' + self.unidade[SINGULAR]
elif len(self.unidade[PLURAL]):
texto_inteiro += ' ' + self.unidade[PLURAL]
#
# Extenso da parte decimal
#
if decimal > 0:
texto_decimal = self._potencia(decimal, genero=self.genero_unidade_decimal_masculino)
if (decimal == 1) and (len(self.unidade_decimal[SINGULAR])):
texto_decimal += ' ' + self.unidade_decimal[SINGULAR]
elif len(self.unidade_decimal[PLURAL]):
texto_decimal += ' ' + self.unidade_decimal[PLURAL]
if (inteiro > 0) and (decimal > 0):
texto = texto_inteiro + ' e ' + texto_decimal
elif inteiro > 0:
texto = texto_inteiro
else:
texto = texto_decimal
if negativo:
if ((inteiro > 1) or (decimal > 1)):
texto = self.mascara_negativo[PLURAL] % texto
else:
texto = self.mascara_negativo[SINGULAR] % texto
return texto
extenso_unidade = property(get_extenso_unidade)
if __name__ == '__main__':
import sys
e = NumeroPorExtenso(sys.argv[1])
print('Numeral cardinal simples:', e.extenso_cardinal)
print('Numeral ordinal simples:', e.extenso_ordinal)
print('Valor monetário em R$:', e.extenso_unidade)
#
# Unidades sempre definidas na forma
# (unidade_no_singular, unidade_no_plural)
#
e.unidade = ('quilograma', 'quilogramas')
#
# 3 casas decimais de precisão, pois 1 quilograma são 1000 gramas
#
e.precisao_decimal = 3
e.unidade_decimal = ('grama', 'gramas')
print('Valor em quilogramas e gramas (com 3 casas decimais de precisão):', e.extenso_unidade)
e.unidade = ('tonelada', 'toneladas')
e.genero_unidade_masculino = False
#
# 3 casas decimais de precisão, pois 1 tonelada são 1000 quilogramas
#
e.precisao_decimal = 3
e.unidade_decimal = ('quilograma', 'quilogramas')
e.genero_unidade_decimal_masculino = True
print('Valor em toneladas (feminino) e quilogramas (masculino, com 3 casa decimais de precisão):', e.extenso_unidade)
e.unidade = ('dia', 'dias')
e.precisao_decimal = 1
e.unidade_decimal = ('hora', 'horas')
e.genero_unidade_decimal_masculino = False
#
# Se a relação entre a unidade e a unidade decimal não for, bem, decimal...
# No caso, se a precisão é 1, 0,1 dias são quantas horas?
#
e.fator_relacao_decimal = D('2.4')
print('Valor em dias e horas (com 1 casa decimal de precisão):', e.extenso_unidade)
e.unidade = ('pé', 'pés')
e.precisao_decimal = 2
e.unidade_decimal = ('polegada', 'polegadas')
#
# Se a relação entre a unidade e a unidade decimal não for, bem, decimal...
# No caso, se a precisão é 2, 0,01 pés são quantas polegadas?
# Melhor informar em Decimal para evitar problemas de arredondamento
#
e.fator_relacao_decimal = D('0.12')
print('Valor em pés e polegadas (com 2 casas decimais de precisão):', e.extenso_unidade)
e.unidade = ('grau Celsius', 'graus Celsius')
e.genero_unidade_masculino = True
e.precisao_decimal = 1
e.unidade_decimal = ('décimo', 'décimos')
e.genero_unidade_decimal_masculino = True
print('Valor em graus Celsius e décimos (com 1 casa decimais de precisão):', e.extenso_unidade)
e.unidade = ('ponto percentual', 'pontos percentuais')
e.genero_unidade_masculino = True
e.precisao_decimal = 0
print('Valor em pontos percentuais (somente inteiros):', e.extenso_unidade)
e.numero *= -1
print('Valor em pontos percentuais negativos (somente inteiros):', e.extenso_unidade)
e.unidade = ('grau Celsius', 'graus Celsius')
e.mascara_negativo = ('%s negativo', '%s negativos')
print('Valor em graus Celsius negativos:', e.extenso_unidade)