整数の 10 進数表現の長さを取得するための Scala 組み込みメソッドがあるかどうかを知りたいですか?
例:45
長さが2
あります。10321
長さがあり5
ます。
で長さを取得することもできますが10321.toString.length
、String オブジェクトを作成するときのオーバーヘッドのため、これには少し臭いがあります。より良い方法や組み込みの方法はありますか?
アップデート:
- 「より良い」とは、より迅速な解決策を意味します
- 私は正の整数にのみ興味があります
This is definitely personal preference, but I think the logarithm method looks nicer without a branch. For positive values only, the abs
can be omitted of course.
def digits(x: Int) = {
import math._
ceil(log(abs(x)+1)/log(10)).toInt
}
速度が必要な場合は、ランダムな配布を想定して、次のようなものがかなり良いです。
def lengthBase10(x: Int) =
if (x >= 1000000000) 10
else if (x >= 100000000) 9
else if (x >= 10000000) 8
else if (x >= 1000000) 7
else if (x >= 100000) 6
else if (x >= 10000) 5
else if (x >= 1000) 4
else if (x >= 100) 3
else if (x >= 10) 2
else 1
対数を倍精度で計算するのは、床だけが必要な場合は効率的ではありません。
従来の再帰的な方法は次のようになります。
def len(x: Int, i: Int = 1): Int =
if (x < 10) i
else len(x / 10, i + 1)
これは、0 から 10e8 の範囲の整数のログを取得するよりも高速です。
lengthBase10
ただし、上記は他のすべてよりも約4倍高速です。
toString
get length
of int は負の整数に対しては機能しません。このコードは、正の数だけでなく負の数にも機能します。
def digits(n:Int) = if (n==0) 1 else math.log10(math.abs(n)).toInt + 1;
ログをベース10に移動し、フロアを取得して1を追加します。
最も簡単な方法は次のとおりです。
def numberLength(i : Int): Int = i.toString.length
Int
負の値は abs + 1 の長さになるため、guarding-condition を追加することができます。