Created
July 14, 2022 01:23
-
-
Save augustogoulart/9be4c2bfd246b24f176d86c9e4ce7aba to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Cheque por Extenso | |
Apesar de o volume de cheques emitidos ter diminuído drásticamente nos últimos anos, principalmente devido a | |
popularização dos cartões de crédito e débito, eles ainda são utilizados em muitas compras, especialmente as de valor | |
alto. E para auxiliar no seu preenchimento, vários estabelecimentos possuem máquinas que dado o valor da compra, | |
preenchem o cheque com o seu valor por extenso. | |
Desenvolva um programa que dado um valor monetário, seja retornado o valor em reais por extenso. | |
Exemplo: | |
15 415,16 -> quinze mil quatrocentos e quinze reais e dezesseis centavos | |
0,05 -> cinco centavos | |
2,25 -> dois reais e vinte e cinco centavos | |
""" | |
import pytest | |
""" | |
Quem coda: | |
- Augusto | |
- Henrique | |
- Diogo | |
- Eduardo | |
- Anderson | |
- Marcelo | |
""" | |
cardinais = { | |
0: "zero", | |
1: "um", | |
2: "dois", | |
3: "três", | |
4: "quatro", | |
5: "cinco", | |
6: "seis", | |
7: "sete", | |
8: "oito", | |
9: "nove", | |
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", | |
} | |
def singular_plural_real(valor): | |
sufixo = "reais" | |
if valor == 1.00: | |
sufixo = "real" | |
return sufixo | |
def singular_plural_centavos(valor): | |
sufixo = "centavos" | |
if valor == 1.00: | |
sufixo = "centavo" | |
return sufixo | |
def dezena(valor): | |
return valor - valor % 10 | |
def unidade(valor): | |
return valor % 10 | |
def inteiro_para_string(valor): | |
try: | |
valor_cardinal = cardinais[valor] | |
valor_por_extenso = f"{valor_cardinal}" | |
except KeyError: | |
dezena_cardinal = cardinais[dezena(valor)] | |
unidade_cardinal = cardinais[unidade(valor)] | |
valor_por_extenso = f"{dezena_cardinal} e {unidade_cardinal}" | |
return valor_por_extenso | |
def centavo_por_extenso(valor): | |
sufixo = "" | |
if valor > 0: | |
sufixo = f"{inteiro_para_string(valor)} {singular_plural_centavos(valor)}" | |
return sufixo | |
def real_por_extenso(valor): | |
sufixo = "" | |
if valor > 0: | |
sufixo = f"{inteiro_para_string(valor)} {singular_plural_real(valor)}" | |
return sufixo | |
def e(a, b): | |
_e = "" | |
if a and b: | |
_e = " e " | |
return _e | |
def quebra(valor): | |
return int(valor), round(valor % 1, 2) * 100 | |
def cheque_por_extenso(valor): | |
dezena, unidade = quebra(valor) | |
return f"{real_por_extenso(dezena)}{e(dezena, unidade)}{centavo_por_extenso(unidade)}" | |
@pytest.mark.parametrize( | |
"valor, expected", | |
[ | |
(0.01, "um centavo"), | |
(0.50, "cinquenta centavos"), | |
(1.01, "um real e um centavo"), | |
(1.05, "um real e cinco centavos"), | |
(1.25, "um real e vinte e cinco centavos"), | |
(1.99, "um real e noventa e nove centavos"), | |
(1.00, "um real"), | |
(5.00, "cinco reais"), | |
(10.00, "dez reais"), | |
(15.00, "quinze reais"), | |
(19.00, "dezenove reais"), | |
(20.00, "vinte reais"), | |
(21.00, "vinte e um reais"), | |
(85.00, "oitenta e cinco reais"), | |
(99.00, "noventa e nove reais"), | |
(99.05, "noventa e nove reais e cinco centavos"), | |
(99.99, "noventa e nove reais e noventa e nove centavos"), | |
], | |
) | |
def test_cheque_por_extenso(valor, expected): | |
assert cheque_por_extenso(valor) == expected | |
def main(): | |
pytest.main(["-sv", __file__]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment