使用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

Answers:


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

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

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

3
一个很好的技术来获取数字,但是,如果它是一个小数,即12.5,那么您的函数将返回4而不是3 ...
Swarnendu Paul

@Swarnendu:没问题,因为我只有整数。
bit4fox

3
否则,请使用number.toString().match(/\d/g).length
2014年

1
@Bakudan-这个答案似乎已经解决。您可以立即删除两个评论,以免
打扰

1
@ 3ocene好猜!该值保持不变,但在幕后将其强制转换为整数。x | 0只是的又一个又简短又快速的版本Math.floor(x),它会将数字四舍五入。您可以使用实现相同的目的~~x。以下问题对此提供了更多解释:stackoverflow.com/q/9049677/1249581
VisioN

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

以上假设(基于您的示例输入)您希望以整数形式计算位数(因此12345 = 5,因此12345.678 = 5)。如果您想计算该值中的总位数(因此12345.678 = 8),则可以在上述任一函数的“ return”之前将其添加:

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


2
@ Tx3注意!值得庆幸的是,Math.LOG10E自ES1开始就存在,这意味着Math.log(x) * Math.LOG10E它将为兼容而工作。
Mwr247

我认为此功能不起作用:```function numDigits(x){return(Math.log10((x ^(x >> 31))-(x >> 31))| 0)+ 1; }```numDigits(1234567891)-> 10 numDigits(12345678912)-> 9
lokhmakov

@lokhmakov这是因为您提供的第二个数字超出了JavaScript的最大32位整数值,按位运算符(^,>>,|)无法正确处理。
Mwr247

1
真正。人们应该期望JS仅与max safe int一起使用,并且这个数字比几乎任何人都需要的要大得多。我正在开发一个数量很大的游戏,由于这一限制,我无法使用优化的代码,因此我想发表评论,以免其他人陷入类似困境,避免以后破坏代码。好的答案。
贾斯汀

20

由于这是在Google搜索“ javascript获取数字位数”时出现的,因此我想把它扔掉,因为有一个较短的替代方法依赖于内部转换来为您完成:

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

注意!点也算作数字。(in dec_number)
塞巴斯蒂安·诺尔

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

两位数:使用ECMAScript 6(ES6)时需要两个或多个数字的简单功能:

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是要获取长度的数字


0

您可以在此技巧中使用

(''+number).length



-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.