Pythonでドットとコンマを含む文字列をfloatに変換するにはどうすればよいですか?


94

Pythonで123,456.908floatのような文字列を変換するにはどうすればよい123456.908ですか?


11
これを行う適切な方法は、localeモジュールを使用することです。他のすべては、将来トラブルに巻き込まれる非常に厄介なハックです。
ニックバスティン2011

回答:


134

ただ、削除,してreplace()

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

15
これはロケールによって異なります。9 988776,65€フランスで9.988.776,65€ドイツで$ 9,988,776.65米国
Alexandru R

ソースコードに定数を記述していて、コンマを使用して読みやすくしたい場合は、ロケールではなくこれが方法であり、コードが別の場所で失敗します。 python cd_size = float("737,280,000".replace(',','')) (私は実際にintを使用しました)
hum3 2018年

ソースコードに文字列リテラル定数を記述し、それを整数または浮動小数点数に明示的に変換している場合、それは設計に問題があることを示しています。ただし、防御できる場合でも、そのコンテキストのロケールをコードが記述されているロケールに一時的に設定し、ユーザー入力を処理するときにユーザーに適したコンテキストを復元します。setlocaleそもそもそういうわけです。
KarlKnechtel19年

これをしない、それが「123 ,,,, 345」のようなものが可能になります
amohr

152

...または、コンマをフィルターで除外するゴミとして扱う代わりに、文字列全体をfloatのローカライズされたフォーマットとして扱い、ローカリゼーションサービスを使用することもできます。

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
これまでで最もPython的で直感的な方法。+1
Aufwind 2011

2
例に小数点と数字のグループ化文字の両方が含まれている場合は、この回答に賛成票を投じます...
martineau 2011

14
スクリプトにはExtension modules should never call setlocale()
問題ありませんが

13
@wanderer:非推奨となるのatof は文字列の組み込みメソッドです。ここで使用しているのは、標準ライブラリモジュールの関数atofであり、locale非推奨ではありません。
Karl Knechtel 2015

5
スターのインポートが悪いのはそのためです。これを編集して、必要なものをインポートするか、次のように名前空間を改善することをお勧めしますlocale.atof
Mr_and_Mrs_D 2018

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そのようなタスクのための大きなハンマーです。
ローマンボドナルチュク2011

@John Doe:今はずっと良く見えます。私float(number)はその説明的なタッチのために好きです。+1 ;-)
Aufwind 2011

2
9 988776,65€フランスでは9.988.776,65€ドイツでは$ 9,988,776.65米国では---->動作しますか?
Alexandru R

1

,replace()に置き換えるだけです。

f = float("123,456.908".replace(',','')) print(type(f)

type()は、floatに変換されたことを示します


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.