J'ai regardé dans la bibliothèque standard et sur StackOverflow, et je n'ai pas trouvé de question similaire. Alors, existe-t-il un moyen de faire ce qui suit sans rouler ma propre fonction? Points bonus si quelqu'un écrit une belle fonction s'il n'y a pas de manière intégrée.
def stringPercentToFloat(stringPercent)
# ???
return floatPercent
p1 = "99%"
p2 = "99.5%"
print stringPercentToFloat(p1)
print stringPercentToFloat(p2)
>>>> 0.99
>>>> 0.995
Utilisez strip('%')
, comme:
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
float(stringPercent.strip('%')) / 100.0
Une autre façon: float(stringPercent[:-1]) / 100
J'ai écrit la méthode suivante qui devrait toujours renvoyer la sortie avec la même précision exacte que l'entrée, sans erreurs de virgule flottante comme dans les autres réponses.
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
(l'index auquel se trouvait la décimale) de 2, car nous voulons décaler la décimale de 2 espaces vers la gauche.i
est négatif, alors nous devons remplir avec des zéros. Cas de test ( Essayez-le en ligne ):
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)