Python将百分比数字表示形式转换为浮点数

时间:2018-12-02 20:12:46

标签: python numbers data-conversion

是否有一种简单的方法可以将字符串表示形式(例如“ 50%”)转换为python中的浮点数?我在yaml中有数据并且正在解析它。我想支持“ 0.5”和“ 50%”作为有效表示。因此,仅剥离“%”是不够的。

3 个答案:

答案 0 :(得分:2)

那又怎么样:

def parseFloat(str):
    try:
        return float(str)
    except:
        str = str.strip()
        if str.endswith("%"):
            return float(str.strip("%").strip()) / 100
        raise Exception("Don't know how to parse %s" % str)

print(parseFloat("50%"))
print(parseFloat("0.5"))

该代码甚至支持解析如下所示的字符串:

print(parseFloat("  50  % "))

答案 1 :(得分:0)

YAML中任何以百分号结尾的数字序列都将 通常会作为字符串标量加载,因为%不会 标量匹配任何其他模式(特别是不匹配整数) 或浮动)。您当然可以递归地遍历数据结构 从YAML加载并修补内容,但如果 数据结构,用于构造特定对象,然后递归到这些对象中 至少是平凡的,即使不是不可能的。

最好的解决方案是您的YAML将明确 通过标签说明百分比是多少。例如:

a: !Percentage 60%

,从该标记加载的对象的行为类似于float 0.6。但是,在使用YAML时,标记的使用不足,因此您不会 表示您的输入已以这种方式标记。

幸运的是,为百分比设置解析器并不太困难 在加载程序中,以下将针对默认的RoundTripLoader执行此操作。

要解析的YAML文档in.yaml

%YAML 1.2
---
a: 60.3%
42%: 'abc'

您可以挂钩到表示符中以查看字符串是否由数字组成 并以百分号结尾,但是添加解析器会更快:

import sys
import re
from pathlib import Path
import ruamel.yaml
from ruamel.yaml.util import RegExp 


ruamel.yaml.resolver.VersionedResolver.add_implicit_resolver(
    u'percentage',
    RegExp(u'''^(?:[-+]?[0-9_]+%
        |[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)?%
        )$''', re.X
    ),
    list(u'-+0123456789.'))


def construct_percentage(self, node):
     value = float(node.value[:-1]) / 100.0
     return value


ruamel.yaml.constructor.RoundTripConstructor.add_constructor(
    u'percentage', construct_percentage
)


yaml = ruamel.yaml.YAML()
data = yaml.load(Path('in.yaml'))
print(dict(data))

给出:

{'a': 0.603, 0.42: 'abc'}

请注意:

  • 默认情况下,数据会加载到ordereddict的子类中,因此会调用dict()
  • 如果您还想转储百分比,则应将其作为float的子类加载, 因此,当您要转储它们时,它们与普通浮点数是有区别的。
  • 我故意省略了int的其他格式(十六进制,八进制等),并且 浮点数(科学计数法,NaN等)。他们对海事组织没有多大意义,但他们 可以通过模式匹配器重新允许。

答案 2 :(得分:-1)

您可以使用以下方法转换字符串:

a = "40.3%"
b = float(a[:-1])/100