TODOPIC

Lenguajes de programación para PC => Python => Mensaje iniciado por: Daniel1952 en 14 de Octubre de 2021, 21:48:40

Título: Pasar de string a float a mano...
Publicado por: Daniel1952 en 14 de Octubre de 2021, 21:48:40
Hola gente ¿como están? muy buen Viernes para todos.
No me hagan caso si  están sin tiempo, pero si desean seguir mis "locuras".-
Les cuento, no desconozco que con try-ValueError esto se logra de una manera eficiente, pero me gusta los desafíos para aprender mas a fondo el lenguaje.-
Bueno al fin la pregunta es ¿me ayudarían a hacer lo mismo pero con menos líneas de código?.-
Por último decirle que me parece que funciona correctamente.-
slds, Daniel.

Código: Python
  1. numero = input("\n Ingrese un número...: ")
  2.  
  3. puntos = otros = 0
  4. for i in numero:
  5.     if i == '0' or i == '1' or i == '2' or i == '3' or i == '4' or i == '5' or i == '6'\
  6.              or i == '7' or i == '8' or i == '9' or numero[0] == '-':
  7.         pass
  8.     elif i == '.':
  9.         puntos +=1
  10.     else:
  11.         otros +=1
  12.  
  13. if otros >= 1 or puntos >= 2:
  14.     print("Ingreso incorrecto")
  15. else:
  16.     numero = float(numero)
  17.  
  18. print(type(numero))
Título: Re:Pasar de string a float a mano...
Publicado por: Nocturno en 15 de Octubre de 2021, 01:38:47
Me temo que si tu número empieza por el signo "-" lo va a dar por bueno aunque tenga más de un punto o caracteres extraños.
Título: Re:Pasar de string a float a mano...
Publicado por: Daniel1952 en 15 de Octubre de 2021, 09:41:27
Hola Nocturno, gracias x ocuparte, tenes razón daba error, evidentemente no analice correctamente la lógica.-
No puedo negar que me dio algo de trabajo llegar hasta aquí pero el karma fue siempre validar un número
de coma flotante negativo, seguire analizando, gracias.-
Título: Re:Pasar de string a float a mano...
Publicado por: Nocturno en 15 de Octubre de 2021, 12:01:59
Así se aprende, Daniel, ánimo.
Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 15 de Octubre de 2021, 12:15:42
Prueba con este

Código: Python
  1. numero_texto = input("\n Ingrese un número...: ")
  2.      
  3. signos, puntos, exponente, otros = 0, 0, 0, 0
  4.  
  5. for i in numero_texto:
  6.     if i in '01232456789':
  7.         pass
  8.     elif i in '+-':
  9.         signos += 1
  10.     elif i == '.':
  11.         puntos += 1
  12.     elif i == 'e':
  13.         exponente += 1
  14.     else:
  15.         otros += 1
  16.      
  17. if signos > 2 or puntos > 1 or exponente > 1  or otros > 0:
  18.     print("Ingreso incorrecto")
  19. else:
  20.     numero = float(numero_texto)
  21.     print(numero, type(numero))
Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 15 de Octubre de 2021, 12:20:11
O este otro con programación funcional:

Código: Python
  1. numero_texto = input("\n Ingrese un número...: ")
  2.      
  3. otros = [c for c in numero_texto if not c in '0123456789.,+-eE']
  4. puntos = [c for c in numero_texto if c in '.']
  5. exponente = [c for c in numero_texto if c in 'eE']
  6. signos = [c for c in numero_texto if c in '+-']
  7.  
  8. if len(signos) > 2 or len(puntos) > 1 or len(exponente) > 1  or len(otros) > 0:
  9.     print("Ingreso incorrecto")
  10. else:
  11.     numero = float(numero_texto)
  12.     print(numero, type(numero))
Título: Re:Pasar de string a float a mano...
Publicado por: Daniel1952 en 15 de Octubre de 2021, 12:44:56
Hola Nocturno, gracias, no te das una idea la fuerza que me das, gracia.-
Título: Re:Pasar de string a float a mano...
Publicado por: Daniel1952 en 15 de Octubre de 2021, 12:46:05
Hola Picuino, gracias, viendo tu código noto como me pasa factura el hecho de que hace
mas de 50 años que termine el secundario, pero bueno es mi pasión y x nada voy a renunciar
a esta bella idea de aprender a programar.-
Estuve mirándolo x arriba pero ya me di cuenta que hay unas cuantas cositas que puedo tomar
que me intrigaban bastante.-
Una sola cosa puedo prometer cuando tenga alguna duda y no encuentre la respuesta en el gran Google me tendrán x acá, abrazo y slds...
Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 15 de Octubre de 2021, 12:48:10
Por último este que aprovecha la capacidad del módulo re para reconocer patrones (es el más rápido y el más exacto):

Código: Python
  1. import re
  2.  
  3. numero_texto = input("\nIngrese un número...: ")
  4.  
  5. numeric_const_pattern = r"""
  6. [-+]? # optional sign
  7. (?:
  8.    (?: \d* \. \d+ ) # .1 .12 .123 etc 9.1 98.1 etc
  9.    |
  10.    (?: \d+ \.? ) # 1. 12. 123. etc 1 12 123 etc
  11. )
  12. # followed by optional exponent part if desired
  13. (?: [Ee] [+-]? \d+ ) ?
  14. $ # End of string
  15. """
  16. re_float = re.compile(numeric_const_pattern, re.VERBOSE)
  17.  
  18. if re_float.match(numero_texto):
  19.     numero = float(numero_texto)
  20.     print(numero, type(numero))
  21. else:
  22.     print("Ingreso incorrecto")
Título: Re:Pasar de string a float a mano...
Publicado por: Nocturno en 15 de Octubre de 2021, 13:08:23
El último me ha dejado así  :shock:

Pero en este creo que da igual el lugar donde se ponga el signo, el punto y el exponente, lo cual no es correcto, ¿no?
Prueba con este

Código: Python
  1. numero_texto = input("\n Ingrese un número...: ")
  2.      
  3. signos, puntos, exponente, otros = 0, 0, 0, 0
  4.  
  5. for i in numero_texto:
  6.     if i in '01232456789':
  7.         pass
  8.     elif i in '+-':
  9.         signos += 1
  10.     elif i == '.':
  11.         puntos += 1
  12.     elif i == 'e':
  13.         exponente += 1
  14.     else:
  15.         otros += 1
  16.      
  17. if signos > 2 or puntos > 1 or exponente > 1  or otros > 0:
  18.     print("Ingreso incorrecto")
  19. else:
  20.     numero = float(numero_texto)
  21.     print(numero, type(numero))
Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 15 de Octubre de 2021, 13:50:48
Claro, en los primeros programas solo cuentas el número de veces que aparecen los caracteres sin tener en cuenta su posición.
En el último programa compruebas que la posición y número de caracteres sean ambos correctos. Primero puedes tener un signo o no [+-]? después puedes tener un número o más \d+ y asi todo.
Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 15 de Octubre de 2021, 13:53:00
Las expresiones regulares (re) son todo un lenguaje por sí mismo. Es muy potente y se pueden hacer reconocimientos muy complejos de patrones:
https://docs.python.org/es/3/library/re.html#regular-expression-syntax
Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 15 de Octubre de 2021, 14:07:54
Sin comentarios sería aún más corto:


Código: Python
  1. import re
  2.  
  3. numero_texto = input("\nIngrese un número...: ")
  4.  
  5. if re.match(r'[+-]?\d+(?:\.\d*)?(?:[eE][+-]\d+)?$', numero_texto):
  6.     numero = float(numero_texto)
  7.     print(numero, type(numero))
  8. else:
  9.     print("Ingreso incorrecto")
Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 15 de Octubre de 2021, 14:12:28
Y además ese mismo método serviría para reconocer todos los números que hay dentro de una cadena de texto:
Código: Python
  1. import re
  2. texto = '3  3.25  56.25e-6 -125.2'
  3. pattern = r'[+-]?\d+(?:\.\d*)?(?:[eE][+-]\d+)?'
  4. for num in re.findall(pattern, texto):
  5.     print(num)

La salida al ejecutar el programa sería:
Código: [Seleccionar]
3
3.25
56.25e-6
-125.2
Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 15 de Octubre de 2021, 14:18:53
Ya lo se, el reconocimiento de patrones es bastante críptico, pero se pueden tomar las 'recetas' de patrones de sitios como stack-overflow:
https://stackoverflow.com/questions/385558/extract-float-double-value
https://stackoverflow.com/questions/4703390/how-to-extract-a-floating-number-from-a-string

O pedir a alguien con experiencia que te haga la receta de reconocimiento de patrones que necesites y una vez que la tienes, aplicarla.
Título: Re:Pasar de string a float a mano...
Publicado por: Nocturno en 16 de Octubre de 2021, 01:33:48
 ((:-)) ((:-)) ((:-))
Título: Re:Pasar de string a float a mano...
Publicado por: Geo en 17 de Octubre de 2021, 12:11:20
Para armar expresiones regulares este sitio me ha sido muy útil:

https://regexr.com

En la parte de arriba armas la expresión regular, en el texto puedes colocar texto para evaluar la expresión y tiene ayuda para guiarte sobre el significado de cada expresión.

También puedes guardar, por ejemplo los números del código de picuino: https://regexr.com/67lku

Título: Re:Pasar de string a float a mano...
Publicado por: Picuino en 17 de Octubre de 2021, 15:56:29
Muy buen enlace Geo.
Me he dado cuenta con él de un pequeño error en mi pattern.