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,“.”,…])
而不是串联。非常感谢。