数千の区切り文字としてコンマが含まれている場合、文字列を数値に変換するにはどうすればよいですか?


83

数千を区切るためにコンマを使用する数値を表す文字列があります。これをPythonで数値に変換するにはどうすればよいですか?

>>> int("1,000,000")

を生成しValueErrorます。

変換する前にコンマを空の文字列に置き換えることはできますが、それはどういうわけか間違っているように感じます。もっと良い方法はありますか?

回答:


101
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) 
locale.atoi('1,000,000')
# 1000000
locale.atof('1,000,000.53')
# 1000000.53

9
+1ですが、ロケール設定を追加してください(デフォルトのロケールで'C'は、引き続きValueError!が表示されます)。
Alex Martelli

1
教祖は次のような意味だと思います:locale.setlocale(locale.LC_ALL、 'en_US.UTF-8')
mbarkhau

コメントありがとうございます。特定のロケールを追加しました。
unutbu 2009年

非常に素晴らしい。このようにして、コンマとポイントも入れ替わるヨーロッパの数字を処理できます。ありがとう。
dsimard 2009年

5
ロケールエラーが発生します:Traceback (most recent call last): File "F:\test\locale_num.py", line 2, in <module> locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) File "F:\Python27\lib\locale.py", line 539, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting
Tony Veijalainen 2012年

39

数千の区切り文字を使用して数値を解析する方法はいくつかあります。そして、@ unutbuによって記述された方法がすべての場合に最適であるとは思えません。だから私は他の方法も挙げています。

  1. 呼び出す適切な場所setlocale()__main__モジュール内です。これはグローバル設定であり、プログラム全体、さらにはC拡張機能にも影響します(ただし、LC_NUMERIC設定はシステムレベルでは設定されませんが、Pythonによってエミュレートされます)。ドキュメントの警告を読みこの方法を実行する前によく考えてください。単一のアプリケーションではおそらく問題ありませんが、幅広い対象者向けのライブラリでは決して使用しないでください。一部のシステムでは使用できない可能性があるため、特定の文字セットエンコーディングを使用してロケールを要求することは避けてください。

  2. 国際化のためにサードパーティのライブラリの1つを使用してください。たとえば、PyICUでは、プロセス全体に影響を与えることなく、使用可能なロケールを使用できます(ロケールを使用せずに、特定の数千の区切り文字で数値を解析することもできます)。

    NumberFormat.createInstance(Locale( 'en_US'))。parse( "1,000,000")。getLong()

  3. 「正しい方法」でサードパーティのライブラリをインストールする必要がない場合は、独自の解析関数を作成してください。int(data.replace(',', ''))厳密な検証が不要な場合と同じくらい簡単です。


1
簡単な方法を推奨するための+1。これと同じ問題が発生したときに必要だったのはそれだけです。
Michael Kristofik 2011

タイプミスを修正するために編集されました(であるsetlocate必要がありますsetlocale)。また、+ 1。
マークディキンソン

恥知らずな自己宣伝、私は3番目のオプションを使用しました。したがって、誰かが興味を持っている場合は、この質問/回答を
1

13

カンマを空の文字列に置き換え、結果の文字列をintまたはに変換しfloatます。

>>> a = '1,000,000'
>>> int(a.replace(',' , ''))
1000000
>>> float(a.replace(',' , ''))
1000000.0

21
OPの質問をもう一度お読みください。特に彼が言うところ:「変換しようとする前にコンマを空の文字列に置き換えることができましたが、それはどういうわけか間違っていると感じます。より良い方法はありますか?」
joaquin 2014年

1
OPとほぼ同じ要件(strsをintに変換)があることを考えると、この回答は役に立ちましたが、受け入れられた回答よりも簡単な方法があることを嬉しく思います。
カイ

4

これは機能します:

(汚いが迅速な方法)

>>> a='-1,234,567,89.0123'
>>> "".join(a.split(","))
'-123456789.0123'

3

受け入れられた回答からロケールエラーが発生しましたが、ここフィンランド(Windows XP)では次の変更が機能します。

import locale
locale.setlocale( locale.LC_ALL, 'english_USA' )
print locale.atoi('1,000,000')
# 1000000
print locale.atof('1,000,000.53')
# 1000000.53

1

私はこれを試しました。それは質問を少し超えています:あなたはインプットを得る。最初に文字列に変換されます(たとえば、Beautifulスープのリストの場合)。次にintに、次にfloatに。

それはそれが得ることができる限り行きます。最悪の場合、変換されていないすべてのものを文字列として返します。

def to_normal(soupCell):
''' converts a html cell from beautiful soup to text, then to int, then to float: as far as it gets.
US thousands separators are taken into account.
needs import locale'''

locale.setlocale( locale.LC_ALL, 'english_USA' ) 

output = unicode(soupCell.findAll(text=True)[0].string)
try: 
    return locale.atoi(output)
except ValueError: 
    try: return locale.atof(output)
    except ValueError:
        return output

0
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "")
'en_US.UTF-8'
>>> print locale.atoi('1,000,000')
1000000
>>> print locale.atof('1,000,000.53')
1000000.53

これは米国のLinuxで行われます。


-1
#python3 tenzin
def changenum(data):
    foo = ""
    for i in list(data):
        if i == ",":
            continue
        else:
            foo += i
    return  float(int(foo))

2
そのコードと一緒に行くためのいくつかの説明?スープのボウルは通常、スープスプーンで提供されます
cs 9519年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.