我查看了标准库和StackOverflow,但没有找到类似的问题。那么,有没有办法在不滚动自己的功能的情况下执行以下操作?如果没有内置的方式,如果有人写了一个漂亮的功能,那么奖励积分。
def stringPercentToFloat(stringPercent)
# ???
return floatPercent
p1 = "99%"
p2 = "99.5%"
print stringPercentToFloat(p1)
print stringPercentToFloat(p2)
>>>> 0.99
>>>> 0.995
答案 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:])
i
(小数位所在的索引)减去2,因为我们希望将小数位移到左侧2个空格。i
为负数,那么我们需要用零填充。
测试用例:
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