import re
def validar_lista_de_numeros(texto: str) -> bool:
"""
Verifica se uma string é composta exclusivamente por números válidos
(inteiros ou de ponto flutuante com '.' ou ',') separados por espaços.
A validação é feita token a token, garantindo que cada parte
corresponda exatamente ao padrão de um número.
Args:
texto (str): A string a ser validada, contendo tokens separados por espaço.
Returns:
bool: True se todos os tokens forem números válidos, False caso contrário.
"""
REGEX_POR_NUMERO = re.compile(r'^[-+]?(\d+([.,]\d+)?|[.,]\d+)$')
texto_limpo: str = texto.strip()
if not texto_limpo:
return False
tokens = re.split(r'\s+', texto_limpo)
for token in tokens:
if not REGEX_POR_NUMERO.fullmatch(token):
return False
return True
def converter_string_para_lista_de_floats(string_numeros: str) -> list[float]:
"""
Converte uma string de números separados por espaço (com '.' ou ',' como decimal)
em uma lista de números de ponto flutuante (float).
Args:
string_numeros (str): A string contendo os números a serem convertidos.
Returns:
list[float]: Uma lista contendo os valores de ponto flutuante.
Raises:
ValueError: Se a string falhar na validação (contiver tokens não numéricos
ou separadores inválidos).
"""
if not validar_lista_de_numeros(string_numeros):
raise ValueError("A string contém formatos não numéricos inválidos ou separadores múltiplos não permitidos.")
string_limpa: str = string_numeros.strip().replace(',', '.')
tokens = re.split(r'\s+', string_limpa)
return [float(token) for token in tokens]
def main() -> None:
entrada: str = ''
lista_de_numeros: list[float] = []
while True:
try:
entrada = input('\nDigite os valores das vendas: ').strip()
lista_de_numeros = converter_string_para_lista_de_floats(entrada)
break
except ValueError as e:
print(f'{e}')
print(f'\nO total de vendas foi: R$ {sum(lista_de_numeros):.2f}')
if __name__ == '__main__':
main()