JavaScriptで桁数を取得する


124

私の投稿のタイトルが示唆しているように、何桁あるのか知りたいのです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ですか?

回答:


229

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

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

浮動小数点演算のよく知られた動作のため、10進数の高速数学解を作成することは簡単ではないため、文字列へのキャストアプローチの方が簡単で、ばかです。@streetlogicsで述べたように、単純な数値から文字列への連結を使用して高速キャストを実行できるため、置換ソリューションを次のように変換できます。

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

3
桁数を取得するための優れた手法ですが、それが小数の場合、つまり12.5の場合、関数は3ではなく4を返します...
Swarnendu Paul

@Swarnendu:私は整数しかないので問題ありません。
bit4fox 2013

3
それ以外の場合は、のようなものを使用してくださいnumber.toString().match(/\d/g).length
VisioN 2014年

1
@爆弾-この回答は修正されたようです。あなたは今それを批判しているあなたの2つのコメントを削除することができます(将来の人々が混乱しないように、そしてこの回答のコードが機能しないと考えてください。)
ArtOfWarfare

1
@ 3oceneいいね!値は変わりませんが、背後で整数にキャストされます。x | 0Math.floor(x)、数の端数を切り捨てる、もう1つの短くて高速なバージョンです。同じことをで実現でき~~xます。次の質問は、ポイントについての詳細な説明を提供します:stackoverflow.com/q/9049677/1249581
VisioN 2017

65

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

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)、上記のいずれかの関数の「戻り値」の前にこれを追加します。

x = Number(String(x).replace(/[^0-9]/g, ''));


2
@ Tx3いいですね!ありがたいことに、Math.LOG10EES1から存在していMath.log(x) * Math.LOG10Eます。つまり、互換性のために機能します。
Mwr247 2015

この関数は機能しないと思います: `` `function numDigits(x){return(Math.log10((x ^(x >> 31))-(x >> 31))| 0)+ 1; } `` `numDigits(1234567891)-> 10 numDigits(12345678912)-> 9
lokhmakov

@lokhmakovこれは、指定した2番目の数値がJavaScriptの32ビット整数の最大値を超えているためです。これは、ビットごとの演算子(^、>>、|)が正しく処理できません。
Mwr247

1
そうだね。JSはmax safe intでのみ動作し、その数はほとんどの人が何でも必要とするよりもはるかに大きいことを期待する必要があります。私は非常に大きな数のゲームを開発していて、その制限のために最適化されたコードを使用できませんでした。また、同じようなボートにいる他の誰かが後でコードが壊れないようにコメントできると思いました。ところで素晴らしい答え。
ジャスティン

20

これは「javascript get digits of digits」という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

4
そして、簡単なjsperfは、これもかなり高速であることを示しています(例:10倍以上):jsperf.com/number-tostring-vs-number
Ledivin

注意!ドットも数として数えます。(dec_number内)
Sebastian Norr

2

桁が必要な場合(セパレータの後)、単純に数値を分割して、2番目の部分(ポイントの後)の長さをカウントできます。

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

2

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

私はまだ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

注:この関数は、小数の平均ドットの後の数字を無視します。小数でカウントしたい場合は、削除してください。ポイントはこちらをチェックしてください!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
`You can do it by simple loop using Math.trunc() function. if in interview interviewer ask to do it without converting it into string`
    let num = 555194154234 ;
    let len = 0 ;
    const numLen = (num) => {
     for(let i = 0; i < num ||  num == 1 ; i++){
        num = Math.trunc(num/10);
        len++ ;
     }
      return len + 1 ;
    }
    console.log(numLen(num));

0

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

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

0

問題ステートメント:カウント数/文字列が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

これが私の解決策です。正と負の数で動作します。お役に立てれば

function findDigitAmount(num) {

   var positiveNumber = Math.sign(num) * num;
   var lengthNumber = positiveNumber.toString();

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4

0

長さを取得するのは簡単です

  `${NUM}`.length

ここで、NUMは長さを取得する数値です




-7

lengthプロパティは、文字列の長さ(文字数)を返します。

空の文字列の長さは0です。

var str = "Hello World!";
var n = str.length;

nの結果は次のようになります:12

    var str = "";
    var n = str.length;

nの結果は次のようになります:0


配列の長さプロパティ:


lengthプロパティは、配列の要素数を設定または返します。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.length;

結果は次のようになります:4

構文:

配列の長さを返します:

array.length

配列の長さを設定します。

array.length=number

2
これは質問に答えません
Steve Taylor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.