web-dev-qa-db-fra.com

Quelle est une façon propre de convertir un pourcentage de chaîne en un flottant?

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
26
Wulfram

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
50
Ashwini Chaudhary
float(stringPercent.strip('%')) / 100.0
16
Mark Ransom

Une autre façon: float(stringPercent[:-1]) / 100

2
WKPlus

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

Explication

  1. Supprimez le "%" de la fin.
  2. Si le pourcentage n'a pas de ".", Renvoyez-le simplement divisé par 100.
  3. Si le pourcentage est négatif, supprimez le "-" et rappelez la fonction, puis convertissez le résultat en négatif et renvoyez-le.
  4. Retirez la décimale.
  5. Décrémenter 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.
  6. Si i est négatif, alors nous devons remplir avec des zéros.
    • Exemple: Supposons que l'entrée soit "1,33%". Pour pouvoir décaler la décimale de 2 espaces vers la gauche, nous aurions besoin de remplir avec un zéro.
  7. Convertissez en flotteur.

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)
2
Hat