簡體   English   中英

Python-確保將字符串轉換為正確的Float

[英]Python - Make sure string is converted to correct Float

我有可能這樣的價格字符串:

20.99, 20, 20.12

有時,用戶可能會將字符串錯誤地發送給我,如下所示:

20.99.0, 20.0.0

這些應該轉換回:

20.99, 20

所以基本上從第二個刪除任何東西。 如果有一個。

只是要清楚,它們將是單獨的,一次只能一個,所以在一個字符串中只有一個價格

有什么不錯的想法嗎?

對於單行代碼,可以使用.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'

你可以做這樣的事情

>>> 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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM