2009-08-12 23 views

Respuesta

24

Usted desea utilizar el módulo unicodedata:

import unicodedata 
unicodedata.numeric(u'⅕') 

Esto imprimirá:

0.20000000000000001 

Si el personaje no tiene un valor numérico, a continuación, unicodedata.numeric(unichr[, default]) volverá por defecto, o si por defecto es no dado levantará ValueError.

+0

¡Oye, eso es genial! –

+6

Python debería obtener un nuevo eslogan pidiendo prestado a Apple: "Hay un módulo para eso". –

+0

Yup baterías incluidas. –

1

Dado que sólo hay un número fijo de las fracciones definidas en Unicode, un diccionario parece apropiada:

Fractions = { 
    u'¼': 0.25, 
    u'½': 0.5, 
    u'¾': 0.75, 
    u'⅕': 0.2, 
    # add any other fractions here 
} 

Actualización: el módulo unicodedata es una solución mucho mejor.

+0

Específicamente, usted está buscando en caracteres U + 00BC-E (http://www.unicode.org/charts/PDF/U0080.pdf) y U + 2153-E (http://www.unicode.org/charts/PDF/U2150.pdf). Simplemente busque el índice (http://www.unicode.org/Public/UNIDATA/Index.txt) como "vulgar". –

1

Quizás podría descomponer la fracción usando "unicodedata" module y luego buscar el FRACTION SLASH character y luego es solo una cuestión de división simple.

Por ejemplo:

>>> import unicodedata 
>>> unicodedata.lookup('VULGAR FRACTION ONE QUARTER') 
u'\xbc' 
>>> unicodedata.decomposition(unicodedata.lookup('VULGAR FRACTION ONE QUARTER')) 
'<fraction> 0031 2044 0034' 

Actualización: Voy a dejar esta respuesta aquí por referencia, pero utilizando unicodedata.numeric() de acuerdo con la respuesta de Karl es una idea mucho mejor.

1

En Python 3.1, no necesita la 'u', y producirá 0.2 en lugar de 0.20000000000000001 .

>>> unicodedata.numeric('⅕') 
0.2 
+1

assert (0.2 == 0.20000000000000001) ... Lo que posiblemente quiso decir es que el float producido por el unicodedata.numeric() NO ha cambiado, pero repr() se ha mejorado para producir una respuesta menos aterradora, pero igualmente computacionalmente equivalente donde sea posible. –

0

estoy afirmando lo obvio aquí, pero es muy fácil de extender esto para los casos cuando la gente escribe "1 ¾", que significa "1,75", así que sólo voy a compartir aquí para una referencia rápida:

import unicodedata 

# Assuming that the unicode is always the last character. You always going to see stuff like "3¼", or "19¼" whereas stuff like "3¼5" 
# does not have a clear interpretation 

def convertVulgarFractions(vulgarFraction): 

    if (len(vulgarFraction) == 1): 
     return unicodedata.numeric(vulgarFraction) 

    if (len(vulgarFraction) > 1) & (not (vulgarFraction[:len(vulgarFraction)-1].isdigit())): 
     raise ArithmeticError("The format needs to be numbers ending with a vulgar fraction. The number inserted was " + 
           str(vulgarFraction)) 

    if vulgarFraction[len(vulgarFraction)-1].isdigit(): 
     return float(vulgarFraction) 
    else: 
     return float(vulgarFraction[:len(vulgarFraction)-1]) + unicodedata.numeric(vulgarFraction[len(vulgarFraction)-1]) 
0

Aunque no es exactamente lo que se pregunta, quizás alguien quiera convertirlo a una fracción en lugar de a una carroza. Después de todo, una fracción es lo que realmente representa.

unicodedata.normalize("NFKC", "⅕") resultados en "1⁄5". Esto no es (en la actualidad) entendido por fractions.Fraction, que espera una fracción descrita con / en lugar de . Sin embargo, es fácil de reemplazar:

In [313]: def unifrac_to_frac(s): 
    ...:  return fractions.Fraction(unicodedata.normalize("NFKC", s).replace("⁄", "/")) 
    ...: 

In [315]: unifrac_to_frac("⅕") 
Out[315]: Fraction(1, 5) 

In [316]: unifrac_to_frac("½") 
Out[316]: Fraction(1, 2) 

In [317]: unifrac_to_frac("↉") 
Out[317]: Fraction(0, 1) 
Cuestiones relacionadas