数千を区切るためにコンマを使用する数値を表す文字列があります。これをPythonで数値に変換するにはどうすればよいですか?
>>> int("1,000,000")
を生成しValueErrorます。
変換する前にコンマを空の文字列に置き換えることはできますが、それはどういうわけか間違っているように感じます。もっと良い方法はありますか?
回答:
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
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
数千の区切り文字を使用して数値を解析する方法はいくつかあります。そして、@ unutbuによって記述された方法がすべての場合に最適であるとは思えません。だから私は他の方法も挙げています。
呼び出す適切な場所setlocale()は__main__モジュール内です。これはグローバル設定であり、プログラム全体、さらにはC拡張機能にも影響します(ただし、LC_NUMERIC設定はシステムレベルでは設定されませんが、Pythonによってエミュレートされます)。ドキュメントの警告を読み、この方法を実行する前によく考えてください。単一のアプリケーションではおそらく問題ありませんが、幅広い対象者向けのライブラリでは決して使用しないでください。一部のシステムでは使用できない可能性があるため、特定の文字セットエンコーディングを使用してロケールを要求することは避けてください。
国際化のためにサードパーティのライブラリの1つを使用してください。たとえば、PyICUでは、プロセス全体に影響を与えることなく、使用可能なロケールを使用できます(ロケールを使用せずに、特定の数千の区切り文字で数値を解析することもできます)。
NumberFormat.createInstance(Locale( 'en_US'))。parse( "1,000,000")。getLong()
「正しい方法」でサードパーティのライブラリをインストールする必要がない場合は、独自の解析関数を作成してください。int(data.replace(',', ''))厳密な検証が不要な場合と同じくらい簡単です。
setlocate必要がありますsetlocale)。また、+ 1。
カンマを空の文字列に置き換え、結果の文字列をintまたはに変換しfloatます。
>>> a = '1,000,000'
>>> int(a.replace(',' , ''))
1000000
>>> float(a.replace(',' , ''))
1000000.0
受け入れられた回答からロケールエラーが発生しましたが、ここフィンランド(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
私はこれを試しました。それは質問を少し超えています:あなたはインプットを得る。最初に文字列に変換されます(たとえば、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
'C'は、引き続きValueError!が表示されます)。