我有可能的价格字符串:
20.99, 20, 20.12
有时用户可能会错误地将字符串发送给我:
20.99.0, 20.0.0
这些应该转换回:
20.99, 20
所以基本上从第二个删除任何东西。如果有的话。
为了清楚起见,他们会一个人一个人,所以一个字符串中只有一个价格
任何不错的单线创意?
答案 0 :(得分:8)
对于单行,您可以使用.split()
和.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'
答案 1 :(得分:3)
你可以做这样的事情
>>> 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,然后找到下一个'。'并在字符串切片操作中保留所有内容。
答案 2 :(得分:2)
编辑:请注意,此解决方案不会丢弃第二个小数点的所有内容,但只丢弃第二个点并保留其他数字。如果您想丢弃所有数字,可以使用例如@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]
答案 3 :(得分:1)
如果您正在寻找基于正则表达式的解决方案,并且您的预期行为是在第二个.(decimal)
之后丢弃外翻,而不是
>>> st = "20.99.123"
>>> string_decimal = re.findall(r'\d+\.\d+',st)
>>> float(''.join(string_decimal))
20.99
答案 4 :(得分:1)
>>> 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'