将字符串百分比转换为浮点数的简洁方法是什么?

时间:2012-09-14 22:15:42

标签: python string python-2.7 python-3.x

我查看了标准库和StackOverflow,但没有找到类似的问题。那么,有没有办法在不滚动自己的功能的情况下执行以下操作?如果没有内置的方式,如果有人写了一个漂亮的功能,那么奖励积分。

def stringPercentToFloat(stringPercent)
    # ???
    return floatPercent

p1 = "99%"
p2 = "99.5%"
print stringPercentToFloat(p1)
print stringPercentToFloat(p2)

>>>> 0.99
>>>> 0.995

5 个答案:

答案 0 :(得分:47)

使用strip('%'),因为:

In [9]: "99.5%".strip('%')
Out[9]: '99.5'               #convert this to float using float() and divide by 100


In [10]: def p2f(x):
    return float(x.strip('%'))/100
   ....: 

In [12]: p2f("99%")
Out[12]: 0.98999999999999999

In [13]: p2f("99.5%")
Out[13]: 0.995

答案 1 :(得分:14)

float(stringPercent.strip('%')) / 100.0

答案 2 :(得分:2)

另一种方式: float(stringPercent[:-1]) / 100

答案 3 :(得分:2)

我编写了以下方法,该方法应始终将输出返回到与输入完全相同的精度,没有浮点错误,例如在其他答案中。

def percent_to_float(s):
    s = str(float(s.rstrip("%")))
    i = s.find(".")
    if i == -1:
        return int(s) / 100
    if s.startswith("-"):
        return -percent_to_float(s.lstrip("-"))
    s = s.replace(".", "")
    i -= 2
    if i < 0:
        return float("." + "0" * abs(i) + s)
    else:
        return float(s[:i] + "." + s[i:])

说明

  1. 从最后剥去“%”。
  2. 如果百分比没有“。”,则只需将其除以100。
  3. 如果百分比为负数,则删除“ - ”并重新调用函数,然后将结果转换回负值并将其返回。
  4. 删除小数位。
  5. i(小数位所在的索引)减去2,因为我们希望将小数位移到左侧2个空格。
  6. 如果i为负数,那么我们需要用零填充。
    • 示例:假设输入为“1.33%”。为了能够向左移动小数位2个空格,我们需要用零填充。
  7. 转换为浮动。
  8. 测试用例:

    from unittest.case import TestCase
    
    class ParsePercentCase(TestCase):
        tests = {
            "150%"              : 1.5,
            "100%"              : 1,
            "99%"               : 0.99,
            "99.999%"           : 0.99999,
            "99.5%"             : 0.995,
            "95%"               : 0.95,
            "90%"               : 0.9,
            "50%"               : 0.5,
            "66.666%"           : 0.66666,
            "42%"               : 0.42,
            "20.5%"             : 0.205,
            "20%"               : 0.2,
            "10%"               : 0.1,
            "3.141592653589793%": 0.03141592653589793,
            "1%"                : 0.01,
            "0.1%"              : 0.001,
            "0.01%"             : 0.0001,
            "0%"                : 0,
        }
        tests = sorted(tests.items(), key=lambda x: -x[1])
    
        def test_parse_percent(self):
            for percent_str, expected in self.tests:
                parsed = percent_to_float(percent_str)
                self.assertEqual(expected, parsed, percent_str)
    
        def test_parse_percent_negative(self):
            negative_tests = [("-" + s, -f) for s, f in self.tests]
            for percent_str, expected in negative_tests:
                parsed = percent_to_float(percent_str)
                self.assertEqual(expected, parsed, percent_str)
    

答案 4 :(得分:0)

基于@WKPlus的答案,此解决方案考虑了小数点为点.或逗号,的语言环境

float("-3,5%".replace(',','.')[:-1]) / 100