更新:为了清晰起见,此问题已经过修改。接受的答案解决了原始问题,其中包括精确要求。此要求已被删除。
已修改:我有一个正则表达式函数,可以从任何创建“数字字符串”的字符串中提取数字。对于每个数字字符串,我想要一个单独的函数,将它们重新格式化为浮点状。例如:
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"
注意:我知道以下内容有效,但我更愿意避免类型转换,即str
到float
到str
。
def format_str(number):
return "{:.1f}".format(float(number))
如何在不转换字符串类型的情况下在Python中完成此操作?
答案 0 :(得分:2)
def format_str(s):
working = s + ('.0' if s[-1]!='.' else '0') # 1
return working[:working.index('.')+2] # 2
.0
以保持一致性。如果字符串中已有小数点,则.0
将被忽略。感谢@ user2357112,1.
/ if
处理的else
测试用例。.
及其后面的字符提取所有内容。此功能不会修改字符串中的任何字符,因此如果您将其传递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])