Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Desafio Conversão de Moedas

Minha solução se baseia em quando a URL informar a quantidade(dinheiro), a moeda de origem e a moeda de destino , automaticamente o valor da conversão será mostrado na construção do objeto(URL).

Abaixo as conversões, inclusive funciona com números decimais também:

Na imagem as conversões, mostra em números inteiros e decimais.

Quando a URL não tiver essas informações nada acontecerá:

A imagem mostra que quando outra URL é passada para o construtor nada acontece.

código:

class ExtratorURL:
    def __init__(self, url): 
        self.url = self.__sanitiza_url(url)
        self.__valida_url()
        self.__cambio()

#código omitido...

    def __cambio(self):
        compila_padrao = re.compile('(http(s)?://)?(www.)?(bytebank.com)(.br)?(/cambio)')
        match = compila_padrao.match(self.url)

        if match:

            quantidade = self.pega_valor('quantidade')
            dolar = 5.14

            if self.pega_valor('moedaOrigem') == 'real':

                cambio = float(quantidade.replace(',', '.')) / dolar
                return print(f'US${cambio:0.2f}'.replace('.', ','))

            if self.pega_valor('moedaOrigem') == 'dolar':

                cambio = float(quantidade.replace(',', '.')) * dolar 
                return print(f'R${cambio:0.2f}'.replace('.', ','))

#código omitido...

Se a moeda de destino for a mesma da origem, a origem tem preferencia e automaticamente o destino é considerado a outra moeda.

4 respostas

Olá Weslen, tudo bem com você?

Meus parabéns pela implementação do código, fico feliz que tenha compartilhado com a comunidade do fórum Alura.

Excelente uso da função replace() deixando o resultado da operação com o padrão usado no Brasil, isso é muito importante quando trabalhamos com projetos que disponibilizam informações para o usuário.

Uma dica de implementação para o código, quando realizamos a divisão ou multiplicação de valores do tipo int por valores do tipo float o resultado sempre será do tipo float. Assim, não será necessário convertermos os valores do tipo int para float antes da operação, o Python fará essa conversão por baixo dos panos. Abaixo um exemplo de uso.

quantidade = 1000
dolar = 5.14

cambio_dolar = quantidade / dolar
cambio_real = quantidade * dolar

print(f'US$ {cambio_dolar:0.2f}'.replace('.', ','))
print(f'R$ {cambio_real:0.2f}'.replace('.', ','))

Resultado

US$ 194,55
R$ 5140,00

A validação e cálculo poderá ser escrito da seguinte forma no método __cambio.

        if self.pega_valor('moedaOrigem') == 'real':
            cambio = quantidade / dolar
            return print(f'US${cambio:0.2f}'.replace('.', ','))

        if self.pega_valor('moedaOrigem') == 'dolar':
            cambio = quantidade * dolar
            return print(f'R${cambio:0.2f}'.replace('.', ','))

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Olá, tudo okay e com você?

A variável "quantidade" está sendo convertida para "float" pois ela é inicialmente uma string (o valor é recolhido da URL), então se não houver a conversão vai gerar um erro.

Referente ao replace, parece redundante usar ele duas vezes né? haha, mas foi usado para o link funcionar tanto com números decimais separados por ponto final "." e virgual ",".

solução!

Oii Wesley,

No cenário do seu código, realmente precisaríamos fazer a conversão direta, pois caso não haja a conversão, teríamos o erro:

TypeError: unsupported operand type(s) for /: 'str' and 'float'

Já no exemplo que utilizei, isso não é necessário, pois a variável quantidade já começa sendo um número inteiro. Peço desculpas por não ter deixado isso claro para o seu cenário, onde realmente precisaríamos da conversão.

Em relação a verificação dupla do replace, apesar de parecer redundante, você já antevê um erro, que é em cenários onde recebemos um número inicialmente escrito com vírgula ao invés de ponto - que é o padrão do python.

Continue sempre se desafiando e contando com nosso apoio.

Abraços!

Até mais :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software