2009-12-07 23 views
7

¿Hay alguna biblioteca Python que ayude a analizar y validar cadenas numéricas más allá de lo que admite la función integrada float()? Por ejemplo, además de los números simples (1234.56) y la notación científica (3.2e15), me gustaría ser capaz de analizar formatos como:Análisis flexible de cadenas numéricas en Python

  • números con comas: 2,147,483,647
  • Named 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 tal biblioteca no existiera ya.

+1

esto es un poco fuera de tema: los dos primeros puntos están sujetos a ambigüedades internacionales y del analizador: en Europa "," representa fracción y mil millones no es lo mismo que mil millones americanos. sin embargo, creo que son fácilmente implementables si la entrada está estructurada El último punto está sujeto a redondeo de coma flotante. Puedes usar las clases de Sympy para almacenar valores fraccionarios o puedes hacer tu propia clase. Si no necesitas tener muchas operaciones/operadores, probablemente sea más fácil hacer tu propia clase. – Anycorn

Respuesta

6

Si desea convertir números "localizados" como el formulario "2,147,483,647" estadounidense, puede usar la función atof() del módulo locale. 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 los maneja directamente (desde la versión 2.6); incluso pueden ser construidos a partir de una cadena:

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

Por lo tanto, se puede analizar un número escrito en cualquiera de las 3 primeras maneras que usted menciona, sólo con la ayuda de los dos módulos estándar por encima de:

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.   
0

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

Si no puede encontrar uno, escriba un montón de casos de prueba, luego 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 algo así. Dependiendo de cómo necesite usarlo, es posible que pueda usar Google para hacer parte del trabajo;)

1

Debería ser bastante sencillo construir uno en pyparsing; de hecho, uno de los proyectos de pyparsing tutoriales hace de esto (wordsToNum.py en this page) ya lo hace. Estás 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 que nadie haya hecho lo que estás buscando. para.