📑

bigint型の桁数の確認方法

2023/08/25に公開

 
あるテーブルに作成したデータの型が bigint 型のカラムに対して、そのカラムに保存している数値の桁数を length,count,size メソッドで確認しようとしたところ、確認することができませんでした。

そこで下記に bigint 型で保存している数値の桁数を確認する方法をまとめたので、bigint 型で保存している数値の桁数を確認したい方の参考になれば幸いです。

bigint 型のカラムに対してcount,length,sizeメソッドを使用したとき

[40] pry(main)> Processor.find(173).invoice_registration_number
  Processor Load (0.4ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> 3333333333333

[41] pry(main)> Processor.find(173).invoice_registration_number.count
  Processor Load (1.1ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
NoMethodError: undefined method `count' for 3333333333333:Integer
from (pry):41:in `__pry__'

[42] pry(main)> Processor.find(173).invoice_registration_number.length
  Processor Load (0.4ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
NoMethodError: undefined method `length' for 3333333333333:Integer
from (pry):42:in `__pry__'

[43] pry(main)> Processor.find(173).invoice_registration_number.size
  Processor Load (0.5ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> 8

(sizeメソッド実行時、「8」と表示されているが、登録している数値の桁数は13桁)

エラーの原因は、それぞれのメソッドがinteger型のレシーバ(Processor.find(173).invoice_registration_number)に対して適切に使用することができないからです。

(length,count,size それぞれのメソッドがどんなレシーバに対して使用できるのか調べてみると良いかもです。)

なので、下記のような工夫をしてbigint型のカラムの中に保存している桁数を確認できるようにしました。

 

① digitsメソッドを使用し、数値を配列にしてから桁数を数える。

digitsメソッドについて
https://docs.ruby-lang.org/ja/latest/method/Integer/i/digits.html

[60] pry(main)> Processor.find(173).invoice_registration_number
  Processor Load (1.4ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> 3333333333333

[61] pry(main)> Processor.find(173).invoice_registration_number.digits.length
  Processor Load (0.4ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> 13

[62] pry(main)> Processor.find(173).invoice_registration_number.digits.size
  Processor Load (0.4ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> 13

[63] pry(main)> Processor.find(173).invoice_registration_number.digits.count
  Processor Load (0.4ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> 13

 

② to_s メソッドを使用し、文字列にしてから桁数を数える。

[64] pry(main)> Processor.find(173).invoice_registration_number.to_s
  Processor Load (0.7ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> "3333333333333"

[65] pry(main)> Processor.find(173).invoice_registration_number.to_s.length
  Processor Load (0.5ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> 13

[66] pry(main)> Processor.find(173).invoice_registration_number.to_s.size
  Processor Load (0.4ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
=> 13

[67] pry(main)> Processor.find(173).invoice_registration_number.to_s.count
  Processor Load (0.5ms)  SELECT "processors".* FROM "processors" WHERE "processors"."id" = $1 LIMIT $2  [["id", 173], ["LIMIT", 1]]
ArgumentError: wrong number of arguments (given 0, expected 1+)
from (pry):67:in `count'

countメソッドの時だけエラーが発生しました。

エラーを読むと、「wrong number of arguments (given 0, expected 1+)」とあるように、strign型のカラムに対して count メソッドを使用するときは、少なくとも1つ以上の引数が必要らしいです。

https://docs.ruby-lang.org/ja/2.6.0/method/Enumerable/i/count.html
https://docs.ruby-lang.org/ja/latest/method/String/i/count.html

 
以上が、bigint型で保存している数値の桁数を確認する方法の説明になります。

Discussion