如何在Python中将unicode字符转换为浮点数?

时间:2009-08-12 01:23:16

标签: python unicode floating-point

我正在解析一个具有分数的Unicode表示的网页。我希望能够直接获取这些字符串并将它们转换为浮点数。例如:

“⅕”将变为0.2

有关如何在Python中执行此操作的任何建议吗?

7 个答案:

答案 0 :(得分:25)

您想使用unicodedata模块:

import unicodedata
unicodedata.numeric(u'⅕')

这将打印:

0.20000000000000001

如果字符没有数值,则unicodedata.numeric(unichr[, default])将返回默认值,或者如果未给出default,则会引发ValueError。

答案 1 :(得分:2)

浮点数的Unicode表示形式称为Vulgar Fractions

您可以使用unicodedata.numeric(char)

将它们转换为浮点数

但是,numeric(char)不适用于之类的内容。这需要更多的努力:

from unicodedata import numeric

samples = ["3¼","19¼","3 ¼","10"]

for i in samples:
    if len(i) == 1:
        v = numeric(i)
    elif i[-1].isdigit():
        # normal number, ending in [0-9]
        v = float(i)
    else:
        # Assume the last character is a vulgar fraction
        v = float(i[:-1]) + numeric(i[-1])
    print(i, v)

输出:

3¼ 3.25
19¼ 19.25
3 ¼ 3.25
10 10.0

您可能还有兴趣使用正则表达式从更广泛的用户输入中隔离这些粗俗分数。您可以使用其unicode字符代码的范围来执行此操作:

/[\u2150-\u215E\u00BC-\u00BE]/g

示例:https://regexr.com/3p8nd

答案 2 :(得分:1)

由于Unicode中只定义了固定数量的分数,因此字典似乎是合适的:

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

更新:unicodedata模块是一个更好的解决方案。

答案 3 :(得分:1)

也许您可以使用"unicodedata" module分解分数,然后查找FRACTION SLASH character然后只是简单分割。

例如:

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

更新:我会在这里留下这个答案供参考,但根据Karl的回答使用unicodedata.numeric()是一个更好的主意。

答案 4 :(得分:0)

在Python 3.1中,您不需要'u',它将产生0.2而不是0.20000000000000001

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

答案 5 :(得分:0)

我在这里说明了这一点,但是当人们写“1¾”意思是“1.75”时,扩展这个很简单,所以我只是在这里分享它以便快速参考:

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])

答案 6 :(得分:0)

虽然不是什么问题,但也许有人希望它转换为分数而不是浮动。毕竟,分数是它真正代表的。

unicodedata.normalize("NFKC", "⅕")会产生"1⁄5"fractions.Fraction不会(目前)理解这一点,/期望用而不是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) 描述一个分数。但是,这很容易替换:

def empty():
    pass