2016-09-26 4 views
5

Arabic and Chinese have their own glyphs for digits. int works correctly with all the different ways to write numbers.ユニコード番号をintに変換するには?

私は

>>> from unicodedata import name 
>>> name('') 
'RUMI DIGIT FIVE' 
>>> int('') 
ValueError: invalid literal for int() with base 10: '' 
>>> int('五') # chinese/japanese number five 
ValueError: invalid literal for int() with base 10: '五' 

(のpython 3.5.0)の挙動を再現することができませんでした私が何か間違ったことをやっていますか?またはクレームが単に間違っている(source)。

+0

pythonで同じものが動作しない3.4 –

+0

on 2.7.5 'TypeError:' name( '')の 'TypeError:str'でなければなりません。 –

+2

ブロックに依存する可能性があります。 'int型( '5')'(デーヴァナーガリー)と 'int型( '5')'(アラビア語)の両方5. – chepner

答えて

5

int /数字を書くためにすべての方法を受け入れていない:私はたちが必要とする情報が含まれていると思いますが、私はそれを見つけることができませんでしたpy_CHARMASKがあります。位置番号システムに使用される数字の文字を理解していますが、RumiChineseも位置が固定されていません。 '五五'もルミ5の2つのコピーも55を表さないので、intはそれらを受け入れません。

+1

これが文書化されている場所の引用は素晴らしいでしょう。 'longobject.c'の' PyLong_FromString'はASCII文字を含む正規化された文字列を受け取るように見え、[0-9a-zA-Z]の各桁の数値を調べるためにルックアップテーブルを使います。 5 == "5"であるが、5!= "5"という情報がどこで符号化されているかを調べる。 – chepner

+1

@chepner:私はこのPythonの動作のいずれも文書化されていないと思います。 ['int' documentation](https://docs.python.org/3/library/functions.html#int)は、アスキーアード以外の数字と[リンク]については何も言及していません(https://docs.python.org/ 3/reference/lexical_analysis.html#integers)を、ascii-only入力を指定するページに追加します。私は、この変更を行ったときに問題報告などを取り上げることができるかもしれませんし、ルミと中国語の数字が非定位であるという引用を提供することは難しくありません。 – user2357112

+0

@chepner:桁の値に関する情報は、['Objects/unicodetype_db.h'](https://hg.python.org/cpython/file/3.5/Objects/unicodectype.c)および[' Objects/unicodectype.c'](https://hg.python.org/cpython/file/3.5/Objects/unicodectype.c)には、コード化された情報を抽出するコードが含まれています。 – user2357112

5

ここでは数値に変換する方法です(どこかにシークレット設定がありますしない限り、intにキャストすると、すべてのケースでは動作しません)

from unicodedata import numeric 
print(numeric('五')) 

結果:5.0

は、誰かが指摘(と正しかったです)いくつかのアラビア語や他の文字は非常にフォールバックメカニズムを持つルーチンを行うことができ、intでうまく働いていること:

from unicodedata import numeric 

def to_integer(s): 
    try: 
     r = int(s) 
    except ValueError: 
     r = int(numeric(s)) 
    return r 

EDIT:zvoneが指摘しているように、浮動小数点数を返す小数点文字があります。例:numeric('\u00be') is 0.75(3/4 char)です。したがって、intへの丸めは必ずしも安全ではありません。

EDIT2:numeric機能は1文字のみを受け入れます。だから、丸めのリスクなしにほとんどのケースを扱うことができる「数値への変換は、」

from unicodedata import numeric 

def to_float(s): 
    try: 
     r = float(s) 
    except ValueError: 
     r = numeric(s) 
    return r 

print(to_float('۵۵')) 
print(to_float('五')) 
print(to_float('¾')) 

結果、次のようになります。

55.0 
5.0 
0.75 

(私は優秀な説明をuser2357112盗むしたいのですが、それでもにたかっていませんすべてのケースをカバーしようとするソリューションを提供してください)

+1

実際、 'numeric( '\ u00be')'は0.75(3/4)です。 – zvone

-1

ソースが正しくありません。 Pythonのドキュメントから

class int(x, base=10)

Return an integer object constructed from a number or string x, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating point numbers, this truncates towards zero.

If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in radix base.

と整数リテラルは、数字だけの文字列です。

編集:、間違ったソースコードに掘ったとPythonはintに文字列を変換したい場合this関数が呼び出されました。

+1

これはなぜ非ラテン数字が 'int'で動作するのか説明しません。 – chepner

+0

@chepner weird、誤解されている可能性があります。 – JeD

関連する問題