Autor Tema: Pasar de string a float a mano...  (Leído 2973 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Pasar de string a float a mano...
« 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))
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Pasar de string a float a mano...
« Respuesta #1 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.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Pasar de string a float a mano...
« Respuesta #2 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.-
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Pasar de string a float a mano...
« Respuesta #3 en: 15 de Octubre de 2021, 12:01:59 »
Así se aprende, Daniel, ánimo.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pasar de string a float a mano...
« Respuesta #4 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))
« Última modificación: 15 de Octubre de 2021, 12:49:04 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pasar de string a float a mano...
« Respuesta #5 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))
« Última modificación: 15 de Octubre de 2021, 12:49:21 por Picuino »

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Pasar de string a float a mano...
« Respuesta #6 en: 15 de Octubre de 2021, 12:44:56 »
Hola Nocturno, gracias, no te das una idea la fuerza que me das, gracia.-
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Pasar de string a float a mano...
« Respuesta #7 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...
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pasar de string a float a mano...
« Respuesta #8 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")
« Última modificación: 15 de Octubre de 2021, 14:08:53 por Picuino »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Pasar de string a float a mano...
« Respuesta #9 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))

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pasar de string a float a mano...
« Respuesta #10 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.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pasar de string a float a mano...
« Respuesta #11 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

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pasar de string a float a mano...
« Respuesta #12 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")
« Última modificación: 16 de Octubre de 2021, 06:00:16 por Picuino, Razón: Simplifico el pattern »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pasar de string a float a mano...
« Respuesta #13 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
« Última modificación: 16 de Octubre de 2021, 06:00:59 por Picuino, Razón: Simplifico el pattern »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pasar de string a float a mano...
« Respuesta #14 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.