ฉันจะแปลงสตริงด้วย dot และ comma เป็น float ใน Python ได้อย่างไร


94

ฉันจะแปลงสตริงที่ต้องการ123,456.908ลอย123456.908ใน Python ได้อย่างไร


11
วิธีที่เหมาะสมในการทำเช่นนี้คือการใช้localeโมดูล - ทุกสิ่งทุกอย่างเป็นเพียงการแฮ็กที่น่ารังเกียจที่จะทำให้คุณมีปัญหาในอนาคต
Nick Bastin

คำตอบ:


134

เพียงแค่ลบ,ด้วยreplace():

float("123,456.908".replace(',',''))

15
ขึ้นอยู่กับสถานที่ 9 988 776,65 €ในฝรั่งเศส 9.988.776,65 €ในเยอรมนี $ 9,988,776.65 ในสหรัฐอเมริกา
Alexandru R

หากคุณกำลังเขียนค่าคงที่ในซอร์สโค้ดและต้องการใช้เครื่องหมายจุลภาคเพื่อให้อ่านง่ายขึ้นนี่เป็นวิธีที่จะไปแทนที่จะเป็นโลแคลซึ่งจะทำให้โค้ดล้มเหลวในตำแหน่งอื่น python cd_size = float("737,280,000".replace(',','')) (ฉันใช้ int จริง)
hum3

หากคุณกำลังเขียนค่าคงที่ตามตัวอักษรสตริงในซอร์สโค้ดแล้วแปลงเป็นจำนวนเต็มหรือลอยอย่างชัดเจนนั่นเป็นสัญญาณว่ามีบางอย่างผิดปกติกับการออกแบบ แต่แม้ว่าจะสามารถป้องกันได้ - เพียงแค่ตั้งค่าโลแคลชั่วคราวเป็นรหัสที่เขียนสำหรับบริบทนั้นจากนั้นเรียกคืนบริบทที่เหมาะสมกับผู้ใช้ของคุณเมื่อจัดการกับข้อมูลที่ผู้ใช้ป้อน นั่นเป็นเหตุผลที่มีมาsetlocaleตั้งแต่แรก
Karl Knechtel

อย่าทำเช่นนี้อนุญาตให้ทำสิ่งต่างๆเช่น "123 ,,,, 345"
amohr

152

... หรือแทนที่จะถือว่าเครื่องหมายจุลภาคเป็นขยะเพื่อกรองออกเราสามารถถือว่าสตริงโดยรวมเป็นการจัดรูปแบบของโฟลที่แปลเป็นภาษาท้องถิ่นและใช้บริการแปล:

from locale import atof, setlocale, LC_NUMERIC
setlocale(LC_NUMERIC, '') # set to your default locale; for me this is
# 'English_Canada.1252'. Or you could explicitly specify a locale in which floats
# are formatted the way that you describe, if that's not how your locale works :)
atof('123,456') # 123456.0
# To demonstrate, let's explicitly try a locale in which the comma is a
# decimal point:
setlocale(LC_NUMERIC, 'French_Canada.1252')
atof('123,456') # 123.456

4
วิธี pythonic และใช้งานง่ายที่สุดจนถึงตอนนี้ +1
Aufwind

2
ฉันจะโหวตคำตอบนี้หากตัวอย่างมีทั้งจุดทศนิยมและอักขระจัดกลุ่มหลักอยู่ในนั้น ...
martineau

14
เหมาะสำหรับสคริปต์ไม่ดีสำหรับห้องสมุด:Extension modules should never call setlocale()
blueFast

13
@wanderer: สิ่งที่เลิกใช้คือatof วิธีการสตริงในตัว สิ่งที่ฉันใช้ที่นี่คือฟังก์ชันatofจากlocaleโมดูลไลบรารีมาตรฐานซึ่งไม่ได้เลิกใช้งานเลย
Karl Knechtel

5
นั่นเป็นสาเหตุที่การนำเข้ารูปดาวไม่ดี - ฉันขอแนะนำให้คุณแก้ไขสิ่งนี้เพื่อนำเข้าสิ่งที่จำเป็นหรือเนมสเปซที่ดีกว่าเช่นเดียวกับในlocale.atof
Mr_and_Mrs_D

8

หากคุณไม่ทราบว่าสถานที่เกิดเหตุและคุณต้องการที่จะแยกชนิดของหมายเลขใด ๆ ใช้นี้parseNumber(text)ฟังก์ชั่น ไม่สมบูรณ์แบบ แต่คำนึงถึงกรณีส่วนใหญ่:

>>> parseNumber("a 125,00 €")
125
>>> parseNumber("100.000,000")
100000
>>> parseNumber("100 000,000")
100000
>>> parseNumber("100,000,000")
100000000
>>> parseNumber("100 000 000")
100000000
>>> parseNumber("100.001 001")
100.001
>>> parseNumber("$.3")
0.3
>>> parseNumber(".003")
0.003
>>> parseNumber(".003 55")
0.003
>>> parseNumber("3 005")
3005
>>> parseNumber("1.190,00 €")
1190
>>> parseNumber("1190,00 €")
1190
>>> parseNumber("1,190.00 €")
1190
>>> parseNumber("$1190.00")
1190
>>> parseNumber("$1 190.99")
1190.99
>>> parseNumber("1 000 000.3")
1000000.3
>>> parseNumber("1 0002,1.2")
10002.1
>>> parseNumber("")

>>> parseNumber(None)

>>> parseNumber(1)
1
>>> parseNumber(1.1)
1.1
>>> parseNumber("rrr1,.2o")
1
>>> parseNumber("rrr ,.o")

>>> parseNumber("rrr1rrr")
1

7

หากคุณมีลูกน้ำเป็นตัวคั่นทศนิยมและจุดเป็นตัวคั่นหลักพันคุณสามารถทำได้:

s = s.replace('.','').replace(',','.')
number = float(s)

หวังว่ามันจะช่วยได้


6

อะไรประมาณนี้

 my_string = "123,456.908"
 commas_removed = my_string.replace(',', '') # remove comma separation
 my_float = float(commas_removed) # turn from string to float.

ในระยะสั้น:

my_float = float(my_string.replace(',', ''))


2

นี่เป็นวิธีง่ายๆที่ฉันเขียนขึ้นเพื่อคุณ :)

>>> number = '123,456,789.908'.replace(',', '') # '123456789.908'
>>> float(number)
123456789.908

reเป็นค้อนขนาดใหญ่สำหรับงานดังกล่าว
Roman Bodnarchuk

@ John Doe: ตอนนี้ดูดีขึ้น ฉันชอบfloat(number)เพราะสัมผัสที่บรรยาย +1 ;-)
Aufwind

2
9 988 776,65 €ในฝรั่งเศส 9.988.776,65 €ในเยอรมนี $ 9,988,776.65 ในสหรัฐอเมริกา ----> คุณแน่ใจหรือไม่?
Alexandru R


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.