使用JavaScript获取位数

时间:2013-02-14 16:39:18

标签: javascript count digits

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

19 个答案:

答案 0 :(得分:181)

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

由于well known behaviour of floating point math,为十进制数创建快速数学解法并不容易,因此逐字方法将更容易且更加简单。正如@streetlogics所提到的,快速转换可以通过简单的数字到字符串连接来完成,导致替换解决方案转换为:

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

答案 1 :(得分:53)

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

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 :(得分:18)

由于这出现在谷歌搜索" javascript得到的数字和#34;,我想把它扔到那里,有一个较短的替代品,依赖内部铸造为你完成:

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

注意::此功能将忽略小数位数后的数字。如果要使用小数计数,请删除{{1 }}。直接指出这一点!

Math.floor()

// ES5 +

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

 digitCount(2343) ;

基本是怎么回事。 const digitCount2 = num => String( Math.floor( Math.abs(num) ) ).length; console.log(digitCount2(3343)) toString()是用于将数字转换为字符串的内置函数,一旦转换,便可以通过内置函数String()找到字符串的长度。

警告:,但此功能不适用于负数,如果您尝试使用负数,则check this answer或简单地将length放入其中;

为您加油!

答案 5 :(得分: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));

答案 6 :(得分:1)

将长度设为

很简单
  `${NUM}`.length

其中NUM是要获取其长度的数字

答案 7 :(得分:1)

  

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
  

答案 8 :(得分: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;
}

编辑:仅适用于整数值

答案 9 :(得分:0)

两位数:如果您需要ECMAScript 6(ES6)的数字的两位或更多位数,则使用简单函数:

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

答案 10 :(得分: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;
}    

}

答案 11 :(得分:0)

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

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


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

答案 12 :(得分:0)

您可以在此技巧中使用

(''+number).length

答案 13 :(得分:0)

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

$ pip3 install flask
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: flask in /home/anna/.local/lib/python3.6/site-packages (1.1.2)
Requirement already satisfied: click>=5.1 in /home/anna/.local/lib/python3.6/site-packages (from flask) (7.1.2)
Requirement already satisfied: itsdangerous>=0.24 in /home/anna/.local/lib/python3.6/site-packages (from flask) (1.1.0)
Requirement already satisfied: Jinja2>=2.10.1 in /home/anna/.local/lib/python3.6/site-packages (from flask) (2.11.2)
Requirement already satisfied: Werkzeug>=0.15 in /home/anna/.local/lib/python3.6/site-packages (from flask) (1.0.1)
Requirement already satisfied: MarkupSafe>=0.23 in /home/anna/.local/lib/python3.6/site-packages (from Jinja2>=2.10.1->flask) (1.1.1)

答案 14 :(得分:0)

一种既可用于负数也可用于浮点数的解决方案,并且不调用任何昂贵的String操作函数:

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
   }
}

答案 15 :(得分: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))

答案 16 :(得分:0)

您可以使用Math.abs函数将负数变成正数,并保持正数不变。然后您可以将数字转换为字符串并提供长度。 看一下这个功能:

const digitCount = num => Math.abs(num).toString().length;

我发现这种方法最简单,并且效果很好。

答案 17 :(得分:0)

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

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

注意:我之所以在这里发帖是因为我认为在谷歌上搜索这个答案的人可能也想要一个解决方案来获取数字的小数长度。

答案 18 :(得分:-5)

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