158

正如我的帖子标题所示,我想知道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

4

19 回答 19

274

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将解决兼容性问题。

由于浮点数学的众所周知的行为,为十进制数创建快速数学解决方案并不容易,因此强制转换为字符串的方法将更加简单和万无一失。正如@streetlogics所提到的,可以使用简单的数字到字符串连接来完成快速转换,从而将替换解决方案转换为:

var length = (number + '').replace('.', '').length;  // for floats
于 2013-02-14T16:39:43.913 回答
79

这是一个数学答案(也适用于负数):

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 函数来固定十进制值(0 到 1 之间的任何小数值都只返回 1,而不是负数),并将最终输出加 1 以获取计数。

以上假设(基于您的示例输入)您希望计算整数的位数(因此 12345 = 5,因此 12345.678 = 5 也是如此)。如果您想计算值中的总位数(因此 12345.678 = 8),请在上述任一函数的“返回”之前添加:

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

* 请注意,JavaScript 中的按位运算仅适用于 32 位值(因此最大值为 2,147,483,647)。因此,如果您期望数字大于该数字,请不要使用按位版本,否则它根本行不通。

于 2015-01-28T22:14:30.197 回答
23

由于这是在 Google 搜索“javascript get number of digits”时出现的,我想把它扔在那里,有一个更短的替代方案,它依赖于为您完成的内部转换:

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
于 2014-05-01T21:17:09.893 回答
7

得到长度很简单

  `${NUM}`.length

其中 NUM 是获取长度的数字

于 2019-11-22T04:42:52.133 回答
2

我还在学习 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;
}

编辑:仅适用于整数值

于 2015-11-04T17:35:17.217 回答
2

你可以在这个技巧中使用:

(''+number).length
于 2019-12-26T15:48:35.390 回答
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

于 2016-05-22T12:01:07.547 回答
2

如果您需要数字(在分隔符之后),您可以简单地拆分数字和计算长度第二部分(在点之后)。

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}
于 2015-10-12T07:59:22.397 回答
1

请使用以下表达式获取数字的长度。

length = variableName.toString().length
于 2020-07-28T09:17:31.690 回答
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()它;

为你加油!

于 2019-02-08T13:09:57.207 回答
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));
于 2020-03-12T14:21:53.713 回答
1

虽然没有从技术上回答这个问题,但如果您正在寻找数字小数部分的长度(例如1.35 => 21 => 0),这可能会对您有所帮助:

function fractionalDigitLength(num) {
  if (Number.isInteger(num)) return 0;
  return String(num).split('.')[1].length;
}

注意:我在这里发布的原因是因为我认为人们在谷歌上搜索这个答案可能还需要一个解决方案来获取数字的小数长度。

于 2021-03-18T22:10:14.427 回答
0

对于整数位,我们还可以实现连续除以 10 :

var getNumberOfDigits = function(num){
    var count = 1;
    while(Math.floor(num/10) >= 1){
        num = Math.floor(num/10);
        ++count;
    }
    return count;
}

console.log(getNumberOfDigits(1))
console.log(getNumberOfDigits(12))
console.log(getNumberOfDigits(123))

于 2020-10-19T10:56:35.030 回答
0

一种同时适用于负数和浮点数的解决方案,并且不调用任何昂贵的字符串操作函数:

function getDigits(n) {
   var a = Math.abs(n);            // take care of the sign
   var b = a << 0;                 // truncate the number
   if(b - a !== 0) {               // if the number is a float
       return ("" + a).length - 1; // return the amount of digits & account for the dot
   } else {
       return ("" + a).length;     // return the amount of digits
   }
}
于 2020-08-13T16:01:16.280 回答
0

两位数:如果您需要 ECMAScript 6 (ES6) 中的两位或更多位数字的简单功能:

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;
于 2018-06-05T10:17:18.447 回答
0

这是我的解决方案。它适用于正数和负数。希望这可以帮助

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4
于 2019-10-14T07:21:31.227 回答
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;
}    

}

于 2018-08-17T10:00:30.003 回答
0

您可以使用 Math.abs 函数将负数变为正数并保持正数不变。然后您可以将数字转换为字符串并提供长度。

Math.abs(num).toString().length;

我发现这种方法最简单,而且效果很好。但是如果你确定你会得到正数,你可以把它变成字符串,然后使用长度。

num.toString().length
于 2020-10-24T07:09:48.630 回答
-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
于 2016-06-02T06:23:53.160 回答