私の投稿のタイトルが示すように、 の桁数を知りたいのですvar number
。たとえば、number = 15;
私の関数が を返す場合2
、現在は次のようになっています。
function getlength(number) {
return number.toString().length();
}
しかし、Safari では次の理由で動作していないと表示されますTypeError
:
'2' is not a function (evaluating 'number.toString().length()')
ご覧のとおり、'2'
は実際正しい解決策です。 しかし、なぜそうなるのでしょうかnot a function
?
ベストアンサー1
length
はプロパティであり、メソッドではありません。呼び出すことはできないので、括弧は必要ありません()
。
function getlength(number) {
return number.toString().length;
}
アップデート:コメントで議論されているように、上記の例は浮動小数点数では機能しません。これを機能させるにはString(number).replace('.', '').length
、 でピリオドを削除するか、正規表現 で桁数をカウントしますString(number).match(/\d/g).length
。
速度の点から言えば、与えられた数字の桁数を取得する最も速い方法は、数学的に行うことです。正の整数次のような素晴らしいアルゴリズムがありますlog10
:
var length = Math.log(number) * Math.LOG10E + 1 | 0; // for positive integers
あらゆるタイプの整数(負の数を含む)に対して、次のような素晴らしい最適化された解法があります。翻訳:Math.log10
ただし、 は多くの旧式ブラウザでサポートされていないため、の使用には注意が必要です。Math.log10(x)
を に置き換えるとMath.log(x) * Math.LOG10E
、互換性の問題が解決します。
小数点以下の数値を高速に解くのは簡単ではない。浮動小数点演算のよく知られた動作なので、文字列へのキャストアプローチはより簡単で間違いのない方法となるでしょう。ストリートロジック数値から文字列への単純な連結で高速キャストが可能になり、交換する変換されるソリューション:
var length = (number + '').replace('.', '').length; // for floats