これが数学的な答えです(負の数でも機能します):
function numDigits(x) {
return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}
そして、上記の最適化されたバージョン(より効率的なビット演算):*
function numDigits(x) {
return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}
基本的に、負の値が正しく機能するように、入力の絶対値を取得することから始めます。次に、log10演算を実行して、入力の10の累乗(別のベースで作業している場合は、そのベースの対数を使用します)、つまり桁数を取得します。次に、出力をフロアして、その整数部分のみを取得します。最後に、max関数を使用して10進値を修正し(0と1の間の小数値は、負の数ではなく1を返すだけです)、最終出力に1を加算してカウントを取得します。
上記は、(入力例に基づいて)整数の桁数をカウントすることを前提としています(したがって、12345 = 5、したがって12345.678 = 5も同様です)。値の合計桁数をカウントする場合(つまり、12345.678 = 8)、上記のいずれかの関数の「return」の前にこれを追加します。
x = Number(String(x).replace(/[^0-9]/g, ''));
* JavaScriptのビット演算は、32ビット値でのみ機能することに注意してください(最大2,147,483,647)。したがって、それより大きい数値が予想される場合は、ビット単位のバージョンを使用しないでください。使用しないと、単に機能しません。