Python:如何有效地重新格式化数字字符串?

Python:如何有效地重新格式化数字字符串?,python,string,numbers,Python,String,Numbers,更新:为了清晰起见,对该问题进行了修订。被接受的答案涉及原始问题,其中包括精度要求。这项规定现已取消 修订版:我有一个正则表达式函数,可以从任何创建“数字字符串”的字符串中提取数字。对于每个数字字符串,我需要一个单独的函数,将它们重新格式化为类似浮点的形式。例如: format_str("23.05") "23.05" format_str("23") "23.0" 后一个示例演示了从类int到类float的重要转换,它有效地将“.0”附加到类int字符串。类似浮动的字符串可能保持不变 下面

更新:为了清晰起见,对该问题进行了修订。被接受的答案涉及原始问题,其中包括精度要求。这项规定现已取消

修订版:我有一个正则表达式函数,可以从任何创建“数字字符串”的字符串中提取数字。对于每个数字字符串,我需要一个单独的函数,将它们重新格式化为类似浮点的形式。例如:

format_str("23.05")
"23.05"

format_str("23")
"23.0"
后一个示例演示了从类int到类float的重要转换,它有效地将
“.0”
附加到类int字符串。类似浮动的字符串可能保持不变

下面是一个数字字符串示例,包括整数和类似浮点的值:

import numpy as np

# Build a random sampling of integers and floats
size = 100000
float_arr = np.random.uniform(1, 5000, size=size/2.)
integer_arr = np.random.randint(1, 5000, size=(size/2.))
mixed_set = set(float_arr) | set(integer_arr)
numeric_strs = list(str(num) for num in mixed_set)
下面是一个测试:

def test_equiv_strs(func, numeric_strs):
    """Verify the function has the same result as type-conversion operation."""
    for num_str in numeric_strs:
        actual = func(num_str)
        expected = str(float(num_str))                     # double type converstion
        nt.assert_equal(actual, expected)
        nt.assert_is_instance(actual, str)
        #print("Orig. {}, Non-convert {}, Conversions {}".format(num_str, actual, expected))

test_equiv_strs(format_str, numeric_strs)
在Python中,如何最有效地格式化数字字符串,使其像字符串一样浮动


ORIGINAL:我想要一个函数,它可以格式化精度为一个小数点的数字字符串。函数应该返回一个字符串

format_str("23")
"23.0"

format_str("23.0")
"23.0"
注意:我知道以下方法有效,但我更喜欢避免类型转换,即
str
float
str

def format_str(number):
    return "{:.1f}".format(float(number))
在Python中如何在不转换字符串类型的情况下实现这一点

def format_str(s):
    working = s + ('.0' if s[-1]!='.' else '0')    # 1
    return working[:working.index('.')+2]          # 2
  • 为保持一致性,在末尾加一个
    .0
    。如果字符串中已有小数点,则将忽略
    .0
    。感谢@user2357112提供了
    1.
    testcase,由
    if
    /
    else
    处理
  • 通过
    及其后面的字符提取所有内容

  • 此函数不修改字符串中的任何字符,因此如果将其传递给
    abc
    ,您将得到
    abc.0
    。另外,根据您的问题,这是格式化,而不是舍入。如果你想要舍入,你需要一些更复杂的东西,可能是BCD或有理数,如果你想避免0.999999。。。情况。

    您可以使用
    拆分来完成,但我无法想象您为什么要这样做

    def format_str(number):
        elements = number.split('.')
        elements.append('0')
        return '{}.{}'.format(elements[0], elements[1][0])
    
    您可以与
    ”一起使用。
    作为分隔符:

    def format_str(number):
        r, _, l = number.partition('.')
        return r + '.' + (l[0] if l else '0')
    
    试验

    >>> format_str('23')
    '23.0'
    >>> format_str('23.0')
    '23.0'
    >>> format_str('23.')
    '23.0'
    >>> format_str('23.123')
    '23.1'
    

    你为什么不想转换成float呢?(人们甚至可能会问,为什么这些数字首先存储为字符串。)如果输入是
    '23.66'
    ,您希望输出是
    '23.6'
    还是
    '23.7'
    ?此外,如果你认为字符串到浮点数转换会是一个主要的性能命中,你可能对你的运行时间有什么不切实际的看法。@ PayLang:如果你想用另一种方法来做它,你不知道是否有必要。考虑这是怎么做的。考虑这与代码< >号码= '1。< /代码>。优雅。尽管如此,我将使用
    “”.join([r,“.”,…])
    而不是串联。非常感谢。