Pythonで数値の桁数、任意の桁(位)の値を取得

Modified: | Tags: Python, 数値

Pythonで数値(整数int、浮動小数点数float)の桁数や、任意の桁(位: 一の位や千の位、小数点第一位など)の値を取得する方法を説明する。

計算で求める方法もあるが、ここでは文字列strに変換する方法を用いる。

数値を任意の桁数で丸めるにはround()、小数点以下の桁数を指定して出力したり文字列に変換したりするにはformat()を使う。以下の記事を参照。

また、Pythonで扱える整数intと浮動小数点数floatの範囲については以下の記事を参照。

整数intの桁数・任意の桁の値を取得

整数intを文字列に変換: str()

整数intstr()で文字列に変換できる。

i = 9876
print(i)
# 9876

print(type(i))
# <class 'int'>

s = str(i)
print(s)
# 9876

print(type(s))
# <class 'str'>
source: digit_int.py

桁数を取得: len()

整数intの桁数は変換した文字列の文字数に等しい。文字数はlen()で整数intとして取得できる。

i = 9876
s = str(i)

print(len(s))
# 4

print(type(len(s)))
# <class 'int'>
source: digit_int.py

もちろん、str()len()を一気に書いてもよい。

print(len(str(i)))
# 4
source: digit_int.py

なお、負の整数をstr()で変換すると先頭に符号-を含む文字列となるため、len()で返される文字数も符号-の分を含む値になる。

i_minus = -9876
s_minus = str(i_minus)
print(s_minus)
# -9876

print(len(s_minus))
# 5
source: digit_int.py

組み込み関数abs()で絶対値に変換すると符号を除いた文字数(桁数)を取得できる。

print(abs(i_minus))
# 9876

print(len(str(abs(i_minus))))
# 4
source: digit_int.py

任意の桁(位)の値を取得: インデックス

文字列の任意の位置の値はインデックス[]で取得できる。

インデックスに負の値を指定すると後ろ(右側)から位置を選択可能。たとえば、一の位は一番後ろ(右側)なので[-1]。十の位、百の位…が[-2], [-3]...となる。

i = 9876
s = str(i)

print(s[-1])
# 6

print(s[-3])
# 8
source: digit_int.py

存在しない位置を指定するとエラーになるので注意。

# print(s[-10])
# IndexError: string index out of range
source: digit_int.py

文字列をインデックスで指定して取得できるのは文字列。整数intに変換したい場合はint()を使う。

print(type(s[-1]))
# <class 'str'>

print(int(s[-1]))
# 6

print(type(int(s[-1])))
# <class 'int'>
source: digit_int.py

これもまとめて記述可能。print()での出力は同じだがint()のありなしで型が異なるので注意。

print(str(i)[-1])
# 6

print(int(str(i)[-1]))
# 6
source: digit_int.py

桁区切りありの文字列の場合: replace()

3桁ごとにカンマで区切られた数字の文字列の桁数や任意の桁(位)の値を取得したい場合、文字列のreplace()メソッドでカンマ,を空文字列''に置換して削除すればよい。

s = '9,675'

print(s.replace(',', ''))
# 9675

print(type(s.replace(',', '')))
# <class 'str'>
source: digit_int.py

あとはこれまでの例と同じ。文字数(桁数)はlen()、任意の桁(位)の値はインデックス[]で取得できる。

print(len(s.replace(',', '')))
# 4

print(s.replace(',', '')[-3])
# 6
source: digit_int.py

上述のように、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()

浮動小数点数floatstr()で文字列に変換できる。

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()で取得できる文字数は1strip()または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()

小数点以下の桁数が多い浮動小数点数floatstr()で文字列に変換すると、自動的に指数表記の文字列になる場合がある。

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()でもよい。

関連カテゴリー

関連記事