Skip to content

Instantly share code, notes, and snippets.

@augustogoulart
Created July 14, 2022 01:23
Show Gist options
  • Save augustogoulart/9be4c2bfd246b24f176d86c9e4ce7aba to your computer and use it in GitHub Desktop.
Save augustogoulart/9be4c2bfd246b24f176d86c9e4ce7aba to your computer and use it in GitHub Desktop.
"""
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