Cadena numérica flexible que analiza en Python

¿Hay alguna biblioteca de Python que ayude a analizar y validar cadenas numéricas más allá de lo que es compatible con la función incorporada float ()? Por ejemplo, además de los números simples (1234.56) y la notación científica (3.2e15), me gustaría poder analizar formatos como:

  • Números con comas: 2,147,483,647
  • Nombrados grandes números: 5.5 mil millones
  • Fracciones: 1/4

Hice un poco de búsqueda y no pude encontrar nada, aunque me sorprendería si esa biblioteca no existiera.

Si desea convertir números “localizados” como el formulario “2,147,483,647” estadounidense, puede usar la función atof() del módulo de configuración regional . Ejemplo:

 import locale locale.setlocale(locale.LC_NUMERIC, 'en_US') print locale.atof('1,234,456.23') # Prints 1234456.23 

En cuanto a las fracciones, Python ahora las maneja directamente (desde la versión 2.6); incluso se pueden construir a partir de una cadena:

 from fractions import Fraction x = Fraction('1/4') print float(x) # 0.25 

Por lo tanto, puede analizar un número escrito en cualquiera de las 3 primeras formas en que menciona, solo con la ayuda de los dos módulos estándar anteriores:

 try: num = float(num_str) except ValueError: try: num = locale.atof(num_str) except ValueError: try: num = float(Fraction(num_str)) except ValueError: raise Exception("Cannot parse '%s'" % num_str) # Or handle '42 billion' here # 'num' has the numerical value of 'num_str', here. 

Debería ser bastante sencillo crear uno en pyparsing; de hecho, uno de los proyectos de pyparsing tutoriales hace algo de esto ( wordsToNum.py en esta página ) ya lo hace. Está hablando de cosas que realmente no tienen representaciones estándar (estándar en el sentido de ISO 8602, no estándar en el sentido de “lo que todos saben”), por lo que podría ser fácilmente que nadie haya hecho lo que está buscando. para.

No he oído hablar de uno. ¿Conoces alguna biblioteca de este tipo para otros idiomas? De esa manera usted podría aprovechar su documentación y pruebas.

Si no puede encontrar uno, escriba un montón de cajas de prueba, entonces podemos ayudarlo a completar el código de análisis.

Google debe tener uno, intente buscar 5.5billion * 10, pero no creo que hayan abierto nada de eso. Dependiendo de cómo necesite usarlo, es posible que pueda usar Google para hacer parte del trabajo;)

Babel tiene soporte para el primer caso (números i18n con comas). Documentos: http://babel.edgewall.org/wiki/ApiDocs/babel.numbers .

Soportar números con nombre simple no debería ser demasiado difícil de codificar, lo mismo que con las fracciones.