web-dev-qa-db-ja.com

JavaScriptで桁数を取得する

投稿のタイトルが示すように、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ですか?

95
bit4fox

lengthはプロパティであり、メソッドではありません。呼び出すことはできません。したがって、括弧()は必要ありません。

function getlength(number) {
    return number.toString().length;
}

UPDATE:コメントで説明したように、上記の例は浮動小数点数では機能しません。機能させるには、String(number).replace('.', '').lengthを使用してピリオドを削除するか、正規表現String(number).match(/\d/g).lengthを使用して数字をカウントします。

速度の観点から、指定された数の桁数を取得する最速の方法は、数学的に行うことです。 正整数には、log10を使用した素晴らしいアルゴリズムがあります:

var length = Math.log(number) * Math.LOG10E + 1 | 0;  // for positive integers

すべてのタイプの整数(ネガを含む)には @ Mwr247 から最適化された素晴らしいソリューションがありますが、多くのレガシーブラウザーではサポートされていないため、Math.log10の使用には注意してください。したがって、Math.log10(x)Math.log(x) * Math.LOG10Eに置き換えると、互換性の問題が解決します。

浮動小数点演算のよく知られた動作 により、10進数の高速数学ソリューションを作成するのは簡単ではありません。 @ streetlogics で述べたように、高速キャストは単純な数値から文字列への連結で行うことができ、replaceソリューションは次のように変換されます。

var length = (number + '').replace('.', '').length;  // for floats
184
VisioN

これが数学的な答えです(負の数でも機能します):

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, ''));
56
Mwr247

これは、「javascript get digit number」のGoogle検索で出てきたので、内部キャストに依存するこれより短い代替手段があることを捨てたいと思いました。

var int_number = 254;
var int_length = (''+int_number).length;

var dec_number = 2.12;
var dec_length = (''+dec_number).length;

console.log(int_length, dec_length);

利回り

3 4
18
streetlogics

数字が必要な場合(区切り記号の後に)、数字を分割し、長さの2番目の部分(ポイントの後)を数えるだけです。

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}
2
Maciej Maciej

私はまだJavascriptを学習していますが、少し前にCでこの関数を思いつきました。この関数は文字列ではなく数学とwhileループを使用するため、Javascript用に書き直しました。たぶんこれは何らかの形で再帰的に行うことができますが、私はまだコンセプトを本当に理解していません:(これは私が思いつくことができる最高です。それがどのくらいの数字で動作するかわかりません。桁。

function count_digits(n) {
    numDigits = 0;
    integers = Math.abs(n);

    while (integers > 0) {
        integers = (integers - integers % 10) / 10;
        numDigits++;
    }
    return numDigits;
}

編集:整数値でのみ動作します

1
Nate

注:この関数は、10進平均dotの後の数字をignore、カウントしたい場合10進数で、Math.floor()を削除します。ポイントに直接これをチェックしてください!

function digitCount ( num )
{
     return Math.floor( num.toString()).length;
}

 digitCount(2343) ;

//ES5 +

 const digitCount2 = num => String( Math.floor( Math.abs(num) ) ).length;

 console.log(digitCount2(3343))

基本的にここで何が起こっているのか。 toString()String()は、数字を文字列に変換するための同じ組み込み関数です。一度変換すると、組み込み関数lengthによって文字列の長さがわかります。

アラート:しかし、この関数は負の数では正しく動作しません。負の数でプレイしようとすると この回答を確認 または単純にMath.abs()を入力しますそれ;

応援よ!

1
BloodyLogic
var i = 1;
while( ( n /= 10 ) >= 1 ){ i++ }
23432          i = 1
 2343.2        i = 2
  234.32       i = 3
   23.432      i = 4
    2.3432     i = 5
    0.23432
1
user40521

問題ステートメント:count.number/string string.length()を使用しない jsfunction。解決策:Forloopを使用してこれを実行できます。例えば

for (x=0; y>=1 ; y=y/=10){
  x++;
}

if (x <= 10) {
  this.y = this.number;                
}   

else{
  this.number = this.y;
}    

}

0
Yogesh Aggarwal

2桁:ECMAScript 6(ES6)で2桁以上の数字が必要な場合の単純な機能:

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;
0
Rafael Melón