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

时间:2016-07-18 18:03:02

标签: python string numbers

更新:为了清晰起见,此问题已经过修改。接受的答案解决了原始问题,其中包括精确要求。此要求已被删除。

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

format_str("23.05")
"23.05"

format_str("23")
"23.0"

后一个例子说明了必须进行的重要转换,从int-like到float-like,它有效地将".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"

注意:我知道以下内容有效,但我更愿意避免类型转换,即strfloatstr

def format_str(number):
    return "{:.1f}".format(float(number))

如何在不转换字符串类型的情况下在Python中完成此操作?

3 个答案:

答案 0 :(得分:2)

def format_str(s):
    working = s + ('.0' if s[-1]!='.' else '0')    # 1
    return working[:working.index('.')+2]          # 2
  1. 在结尾处添加额外的.0以保持一致性。如果字符串中已有小数点,则.0将被忽略。感谢@ user2357112,1. / if处理的else测试用例。
  2. 通过.及其后面的字符提取所有内容。
  3. 此功能不会修改字符串中的任何字符,因此如果您将其传递abc,您将获得abc.0。另外,根据您的问题,这是格式,而不是舍入。如果你想要四舍五入,你需要更复杂的东西,如果你想避免0.999999 ......那么可能是BCD或理性数学。

答案 1 :(得分:2)

您可以将partition'.'一起用作分隔符:

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'

答案 2 :(得分:0)

你可以用split来做,但我无法想象你为什么要这样做。

def format_str(number):
    elements = number.split('.')
    elements.append('0')
    return '{}.{}'.format(elements[0], elements[1][0])