42

標準ライブラリと StackOverflow を調べましたが、同様の質問は見つかりませんでした。それで、自分の関数をロールせずに次のことを行う方法はありますか? 組み込みの方法がなくても、誰かが美しい関数を書いた場合のボーナスポイント。

def stringPercentToFloat(stringPercent)
    # ???
    return floatPercent

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

>>>> 0.99
>>>> 0.995
4

6 に答える 6

80

を次のように使用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
于 2012-09-14T22:18:10.463 に答える
19
float(stringPercent.strip('%')) / 100.0
于 2012-09-14T22:18:47.343 に答える
4

他の回答のような浮動小数点エラーなしで、常に入力とまったく同じ精度で出力を返す次のメソッドを作成しました。

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. float に変換します。

テストケース (オンラインで試す):

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)
于 2018-01-29T06:51:36.437 に答える
1

.@WKPlus からの回答に基づいて、このソリューションは、小数点がポイントまたはコンマのいずれかであるロケールを考慮に入れます,

float("-3,5%".replace(',','.')[:-1]) / 100
于 2020-06-16T19:10:19.757 に答える