ast.literal_evalを使用して、Pythonの数値形式をint、float、またはlongに解析できます。
>>> ast.literal_eval('1')
1
>>> ast.literal_eval('1l')
1L
>>> ast.literal_eval('0x2')
2
>>> ast.literal_eval('0b1101')
13
Pythonには「hex」または「oct」または「bin」タイプがないことに注意してください。これらのリテラル文字列は、すぐに同等の10進数に変換されます。
これはかなりうまく機能します:
def numtype(s):
numtypes=[int,long,float,complex]
try:
n=ast.literal_eval(s)
except SyntaxError:
return None
if type(n) not in numtypes:
return None
else:
return type(n)
for t in ['1','0x1','0xf2','1e-10','0o7','1j', '0b1101']:
print t, numtype(t)
プリント:
1 <type 'int'>
0x1 <type 'int'>
0xf2 <type 'int'>
1e-10 <type 'float'>
0o7 <type 'int'>
1j <type 'complex'>
0b1101 <type 'int'>
異なる小数タイプを本当に区別する必要がある場合は、次のようにすることができます。
def numtype(s):
numtypes=[int,long,float,complex]
try:
n=ast.literal_eval(s)
except SyntaxError:
return None
if type(n) not in numtypes:
return None
if type(n) != int:
return type(n)
else:
if 'x' in s.lower():
return 'HEX'
if 'o' in s.lower():
return 'OCT'
if 'b' in s.lower():
return 'BIN'
return int