note.nkmk.me

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

Date: 2019-01-21 / Modified: 2020-03-29 / tags: Python

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

  • 整数intの場合
    • 文字列に変換: str()
    • 桁数を取得: len()
    • 任意の桁(位)の値を取得: インデックス
    • 桁区切りありの文字列の場合: replace()
  • 浮動小数点数floatの場合
    • 文字列に変換: str()
    • 小数点で分割: split()
    • 桁数を取得: len()
    • 任意の桁(位)の値を取得: インデックス
    • 小数点以下の桁数が多い場合: format(), rstrip(), strip()

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

スポンサーリンク

整数intの場合

文字列に変換: str()

以下の整数intを例とする。

i = 9876

print(i)
# 9876

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

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

s = str(i)

print(s)
# 9876

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

桁数を取得: len()

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

print(len(s))
# 4

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

str()len()を一気に書いてもOK。

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]...となる。

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
source: digit_int.py

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

前者は文字列strで後者は整数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の場合

文字列に変換: str()

以下の浮動小数点数floatを例とする。

f = 987.6543

print(f)
# 987.6543

print(type(f))
# <class 'float'>

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

s = str(f)

print(s)
# 987.6543

print(type(s))
# <class 'str'>

str()では値によっては指数表記の文字列に変換される場合があるので注意。後述のようにformat()を使う必要がある。

また、整数の例と同様に、負の値の場合は先頭に符号-を含む文字列となる。符号を無視したい場合はabs()で絶対値に変換すればよい。

小数点で分割: split()

文字列のsplit()メソッドで任意の文字で分割できる。ここでは小数点.で整数部と小数部に分割する。分割された文字列のリストが返される。

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()で取得可能。

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となる。

print(str(0.123).split('.'))
# ['0', '123']

print(len(str(0.123).split('.')[0]))
# 1

print(str(0.123).strip('0').split('.'))
# ['', '123']

print(len(str(0.123).strip('0').split('.')[0]))
# 0

strip()を使った例は最後にも示す。

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

整数intの場合と同じ。任意の位置の値はインデックス[]で取得する。

小数部については小数点第一位、第二位、第三位...が[0], [1], [2]に相当する。

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

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事