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

Python将百分比数字表示转换为浮点,python,numbers,data-conversion,Python,Numbers,Data Conversion,在python中是否有一种简单的方法可以将字符串表示形式(如“50%”)转换为浮点?我有yaml中的数据,正在解析它。我支持“0.5”和“50%”作为有效的陈述。因此,仅剥离“%”是不够的。您可以使用以下方法转换字符串: a = "40.3%" b = float(a[:-1])/100 可以使用以下命令转换字符串: a = "40.3%" b = float(a[:-1])/100 那么: def parseFloat(str): try: return float

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

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

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

可以使用以下命令转换字符串:

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

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  % "))
那么:

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  % "))

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

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

a: !Percentage 60%
,其中从该标记加载的对象的行为类似于浮点数 0.6. 但是,在使用YAML时,标签没有得到充分利用,而您没有 指出您的输入是以这种方式标记的

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

要分析的.YAML中的YAML文档

%YAML 1.2
---
a: 60.3%
42%: 'abc'
您可以钩住representer以检查字符串是否由数字组成 并以百分号结尾,但添加冲突解决程序更快:

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'}
请注意:

  • 默认情况下,数据加载在
    orderedict
    的子类中,因此调用
    dict()
  • 如果还希望转储百分比,则应将其作为float的子类加载, 因此,当您要转储它们时,它们与正常的浮动是不同的
  • 我故意省略了
    int
    s(十六进制、八进制等)和 浮动(科学记数法、NaN等)。它们在我看来没有多大意义,但它们 可以通过模式匹配器重新允许

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

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

a: !Percentage 60%
,其中从该标记加载的对象的行为类似于浮点数 0.6. 但是,在使用YAML时,标签没有得到充分利用,而您没有 指出您的输入是以这种方式标记的

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

要分析的.YAML
中的YAML文档

%YAML 1.2
---
a: 60.3%
42%: 'abc'
您可以钩住representer以检查字符串是否由数字组成 并以百分号结尾,但添加冲突解决程序更快:

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'}
请注意:

  • 默认情况下,数据加载在
    orderedict
    的子类中,因此调用
    dict()
  • 如果还希望转储百分比,则应将其作为float的子类加载, 因此,当您要转储它们时,它们与正常的浮动是不同的
  • 我故意省略了
    int
    s(十六进制、八进制等)和 浮动(科学记数法、NaN等)。它们在我看来没有多大意义,但它们 可以通过模式匹配器重新允许

嘿,伙计们,问题是关于“0.5”和“50%”的可能重复!''print([float(string.split(“%”[0])/100如果len(string.split(“%”)大于1,则字符串中字符串的float(string])可能重复Hey guys,问题是关于“0.5”和“50%”!''print([float(string.split(“%”[0])/100,如果len(string.split(“%”)大于1,则字符串中字符串的float(string])看起来是迄今为止最好的!看起来是目前为止最好的!这是一个很好的答案,但我使用的是pyyaml。我真的不想让YAML更显式,因为它需要保持易于输入!什么不容易打字?您是指“%YAML”标记和指令指示器吗?我希望您认识到这些是可选的。我的意思是标记(
!Percentage
)然后使用答案第二部分中的替代项并注册您的模式,这在YAML编辑期间不需要额外键入。这是一个不错的答案,但我使用的是pyyaml。我真的不想让YAML更显式,因为它需要保持易于输入!什么不容易打字?您是指“%YAML”标记和指令指示器吗?我希望您认识到这些是可选的。我的意思是标记(
!Percentage
),然后使用答案第二部分中的替代项并注册您的模式,这在YAML编辑期间不需要额外键入。