Pythonで数値の桁数、任意の桁(位)の値を取得
Pythonで数値(整数int
、浮動小数点数float
)の桁数や、任意の桁(位: 一の位や千の位、小数点第一位など)の値を取得する方法を説明する。
計算で求める方法もあるが、ここでは文字列str
に変換する方法を用いる。
数値を任意の桁数で丸めるにはround()
、小数点以下の桁数を指定して出力したり文字列に変換したりするにはformat()
を使う。以下の記事を参照。
また、Pythonで扱える整数int
と浮動小数点数float
の範囲については以下の記事を参照。
整数intの桁数・任意の桁の値を取得
整数intを文字列に変換: str()
整数int
はstr()
で文字列に変換できる。
i = 9876
print(i)
# 9876
print(type(i))
# <class 'int'>
s = str(i)
print(s)
# 9876
print(type(s))
# <class 'str'>
桁数を取得: len()
整数int
の桁数は変換した文字列の文字数に等しい。文字数はlen()
で整数int
として取得できる。
- 関連記事: Pythonのlen関数の使い方
i = 9876
s = str(i)
print(len(s))
# 4
print(type(len(s)))
# <class 'int'>
もちろん、str()
とlen()
を一気に書いてもよい。
print(len(str(i)))
# 4
なお、負の整数をstr()
で変換すると先頭に符号-
を含む文字列となるため、len()
で返される文字数も符号-
の分を含む値になる。
i_minus = -9876
s_minus = str(i_minus)
print(s_minus)
# -9876
print(len(s_minus))
# 5
組み込み関数abs()
で絶対値に変換すると符号を除いた文字数(桁数)を取得できる。
print(abs(i_minus))
# 9876
print(len(str(abs(i_minus))))
# 4
任意の桁(位)の値を取得: インデックス
文字列の任意の位置の値はインデックス[]
で取得できる。
インデックスに負の値を指定すると後ろ(右側)から位置を選択可能。たとえば、一の位は一番後ろ(右側)なので[-1]
。十の位、百の位…が[-2]
, [-3]
...となる。
i = 9876
s = str(i)
print(s[-1])
# 6
print(s[-3])
# 8
存在しない位置を指定するとエラーになるので注意。
# print(s[-10])
# IndexError: string index out of range
文字列をインデックスで指定して取得できるのは文字列。整数int
に変換したい場合はint()
を使う。
print(type(s[-1]))
# <class 'str'>
print(int(s[-1]))
# 6
print(type(int(s[-1])))
# <class 'int'>
これもまとめて記述可能。print()
での出力は同じだがint()
のありなしで型が異なるので注意。
print(str(i)[-1])
# 6
print(int(str(i)[-1]))
# 6
桁区切りありの文字列の場合: replace()
3桁ごとにカンマで区切られた数字の文字列の桁数や任意の桁(位)の値を取得したい場合、文字列のreplace()
メソッドでカンマ,
を空文字列''
に置換して削除すればよい。
s = '9,675'
print(s.replace(',', ''))
# 9675
print(type(s.replace(',', '')))
# <class 'str'>
あとはこれまでの例と同じ。文字数(桁数)はlen()
、任意の桁(位)の値はインデックス[]
で取得できる。
print(len(s.replace(',', '')))
# 4
print(s.replace(',', '')[-3])
# 6
上述のように、len()
の返り値は整数int
だが、文字列をインデックスで指定して取得できるのは文字列str
なので注意。
浮動小数点数floatの桁数・任意の桁の値を取得
浮動小数点数floatを扱う際の注意点
浮動小数点数float
はコンピュータの内部では2進数で表現されているため、10進数の小数と厳密に同じ値を表現できず、誤差を含む場合がある。
print(0.1 + 0.1 + 0.1)
# 0.30000000000000004
また、無限小数のようにすべてを表示できない値もある。
print(1 / 3)
# 0.3333333333333333
以下、浮動小数点数float
の桁数・任意の桁の値を取得する方法を示すが、例えば、無限小数の小数点以下の桁数や、誤差を含む値の小数点以下の深い桁の値などは正しくない可能性があることを注意されたい。
浮動小数点数floatを文字列に変換: str()
浮動小数点数float
もstr()
で文字列に変換できる。
f = 987.6543
print(f)
# 987.6543
print(type(f))
# <class 'float'>
s = str(f)
print(s)
# 987.6543
print(type(s))
# <class 'str'>
str()
では値によっては指数表記の文字列に変換される場合があるので注意。後述のようにformat()
を使う必要がある。
また、整数の例と同様に、負の値の場合は先頭に符号-
を含む文字列となる。符号を無視したい場合はabs()
で絶対値に変換すればよい。
小数点で分割: split()
文字列のsplit()
メソッドで任意の文字で分割できる。ここでは小数点.
で整数部と小数部に分割する。分割された文字列のリストが返される。
f = 987.6543
s = str(f)
print(s.split('.'))
# ['987', '6543']
print(type(s.split('.')))
# <class 'list'>
print(type(s.split('.')[0]))
# <class 'str'>
以下のようにそれぞれ別々の変数に格納することも可能。
s_i, s_d = s.split('.')
print(s_i)
# 987
print(s_d)
# 6543
桁数を取得: len()
整数int
の場合と同様に、整数部と小数部それぞれの桁数をlen()
で取得可能。
f = 987.6543
s = str(f)
s_i, s_d = s.split('.')
print(len(s_i))
# 3
print(len(s_d))
# 4
文字列への変換および小数点での分割とまとめて書くと以下のようになる。
print(len(str(f).split('.')[0]))
# 3
print(len(str(f).split('.')[1]))
# 4
整数部が0
の場合は文字列'0'
とみなされるため、len()
で取得できる文字数は1
。strip()
またはlstrip()
を使うと空の文字列''
となり、len()
で取得できる文字数は0
となる。
f = 0.123
print(str(f).split('.'))
# ['0', '123']
print(len(str(f).split('.')[0]))
# 1
print(str(f).strip('0').split('.'))
# ['', '123']
print(len(str(f).strip('0').split('.')[0]))
# 0
strip()
を使った例は最後にも示す。
任意の桁(位)の値を取得: インデックス
整数int
の場合と同様に、任意の位置の値はインデックス[]
で取得する。
整数部は一の位、十の位、百の位…が[-1]
, [-2]
, [-3]
...、小数部は小数点第一位、第二位、第三位...が[0]
, [1]
, [2]
に相当する。
f = 987.6543
s = str(f)
s_i, s_d = s.split('.')
print(s_i[-1])
# 7
print(s_i[-3])
# 9
print(s_d[0])
# 6
print(s_d[3])
# 3
取得できるのは文字列なので、整数int
に変換したい場合はint()
を使う。
print(s_d[3])
# 3
print(type(s_d[3]))
# <class 'str'>
print(int(s_d[3]))
# 3
print(type(int(s_d[3])))
# <class 'int'>
文字列への変換および小数点での分割とまとめて書くと以下のようになる。print()
での出力は同じだがint()
のありなしで型が異なるので注意。
print(str(f).split('.')[0][-3])
# 9
print(int(str(f).split('.')[0][-3]))
# 9
print(str(f).split('.')[1][3])
# 3
print(int(str(f).split('.')[1][3]))
# 3
小数点以下の桁数が多い場合: format(), rstrip(), strip()
小数点以下の桁数が多い浮動小数点数float
をstr()
で文字列に変換すると、自動的に指数表記の文字列になる場合がある。
print(str(0.0001))
# 0.0001
print(str(0.00001))
# 1e-05
これを防ぐには組み込み関数format()
を使う。小数点以下の桁数を明示的に指定できる。
s_format = format(0.00001, '.8f')
print(s_format)
# 0.00001000
print(type(s_format))
# <class 'str'>
文字列メソッドformat()
やf文字列でも同様の処理が可能。
print('{:.8f}'.format(0.00001))
# 0.00001000
print(f'{0.00001:.8f}')
# 0.00001000
上の例では小数点以下の桁数を8桁に指定している。書式化指定文字列などの詳細は以下の記事を参照。
rstrip()
を使うと末尾(右側)の0
を除去できる。
s_rstrip = s_format.rstrip('0')
print(s_rstrip)
# 0.00001
指定した桁数以上の場合は丸められるので注意。
print(format(0.1, '.8f').rstrip('0'))
# 0.1
print(format(0.0001, '.8f').rstrip('0'))
# 0.0001
print(format(0.00000001, '.8f').rstrip('0'))
# 0.00000001
print(format(0.000000001, '.8f').rstrip('0'))
# 0.
rstrip()
ではなくstrip()
を使うと、先頭(左側)と末尾(右側)の0
が取り除かれる。整数部が0
の場合は空の文字列''
となる。
print(format(0.00001, '.8f').strip('0'))
# .00001
s_i, s_d = format(0.00001, '.8f').strip('0').split('.')
print(s_i)
#
print(type(s_i))
# <class 'str'>
print(len(s_i))
# 0
print(s_d)
# 00001
整数部が0
でない場合は当然そのまま残る。
s_i, s_d = format(1.00001, '.8f').strip('0').split('.')
print(s_i)
# 1
print(s_d)
# 00001
整数部が0
の場合とそうでない場合で処理を切り替えたい場合にはstrip()
を使うと便利。先頭(左側)の0
のみを取り除きたい場合はlstrip()
でもよい。