1

我有可能的价格字符串,例如:

20.99, 20, 20.12

有时,用户可能会错误地将字符串发送给我,如下所示:

20.99.0, 20.0.0

这些应转换回:

20.99, 20

所以基本上从 2nd 中删除任何东西。如果有的话。

需要明确的是,他们会一个人,一次一个,所以一串只有一个价格

有什么好的单线创意吗?

4

5 回答 5

8

对于单线,您可以使用.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'
于 2012-08-22T07:14:56.403 回答
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 递增,然后找到下一个 '.' 并将所有内容留在字符串切片操作中。

于 2012-08-22T07:16:16.727 回答
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]
于 2012-08-22T07:17:07.833 回答
1

如果您正在寻找基于正则表达式的解决方案,并且您的预期行为是在第二个之后丢弃所有.(decimal)内容

>>> st = "20.99.123"
>>> string_decimal = re.findall(r'\d+\.\d+',st)
>>> float(''.join(string_decimal))
20.99
于 2012-08-22T07:21:36.673 回答
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'
于 2012-08-22T07:24:39.407 回答