我有可能的价格字符串,例如:
20.99, 20, 20.12
有时,用户可能会错误地将字符串发送给我,如下所示:
20.99.0, 20.0.0
这些应转换回:
20.99, 20
所以基本上从 2nd 中删除任何东西。如果有的话。
需要明确的是,他们会一个人,一次一个,所以一串只有一个价格
有什么好的单线创意吗?
对于单线,您可以使用.split()
and .join()
:
>>> '.'.join('20.99.0'.split('.')[:2])
'20.99'
>>> '.'.join('20.99.1231.23'.split('.')[:2])
'20.99'
>>> '.'.join('20.99'.split('.')[:2])
'20.99'
>>> '.'.join('20'.split('.')[:2])
'20'
你可以做这样的事情
>>> s = '20.99.0, 20.0.0'
>>> s.split(',')
['20.99.0', ' 20.0.0']
>>> map(lambda x: x[:x.find('.',x.find('.')+1)], s.split(','))
['20.99', ' 20.0']
看find的内在表达。我正在寻找第一个“。” 并以 1 递增,然后找到下一个 '.' 并将所有内容留在字符串切片操作中。
编辑:请注意,此解决方案不会丢弃第二个小数点后的所有内容,而是仅丢弃第二个点并保留其他数字。如果您想丢弃所有数字,您可以使用例如@Blender 的解决方案
如果每行有两条指令并计数,则它只有资格作为单行;
,但这是我想出的:
>>> x = "20.99.1234"
>>> s = x.split("."); x = s[0] + "." + "".join(s[1:])
>>> x
20.991234
不过,它应该比多次扫描字符串要快一些。为了性能成本,您可以这样做:
>>> x = x.split(".")[0] + "." + "".join(x.split(".")[1:])
对于整个列表:
>>> def numify(x):
>>> s = x.split(".")
>>> return float( s[0] + "." + "".join(s[1:]))
>>> x = ["123.4.56", "12.34", "12345.6.7.8.9"]
>>> [ numify(f) for f in x ]
[123.456, 12.34, 12345.6789]
如果您正在寻找基于正则表达式的解决方案,并且您的预期行为是在第二个之后丢弃所有.(decimal)
内容
>>> st = "20.99.123"
>>> string_decimal = re.findall(r'\d+\.\d+',st)
>>> float(''.join(string_decimal))
20.99
>>> s = '20.99, 20, 20.99.23'
>>> ','.join(x if x.count('.') in [1,0] else x[:x.rfind('.')] for x in s.split(','))
'20.99, 20, 20.99'