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

305832 次浏览

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.log(x) * Math.LOG10E替换 Math.log10(x)将解决兼容性问题。

由于 浮点数学众所周知的行为的存在,为十进制数创建快速的数学解决方案并不容易,所以字符串转换方法将更加容易和简单。正如 @ streetlogics所提到的,快速铸造可以通过简单的数字串连,导致 更换解决方案被转换为:

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

因为这是在谷歌搜索“ 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

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

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

* 请注意,JavaScript 中的按位操作只能处理32位值(最大值为2,147,483,647)。因此,如果你期望的数字大于这个数字,就不要使用位版本,否则它就不会起作用。

如果你需要数字(分隔符后) ,你可以简单地分割数字和计数长度第二部分(点后)。

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

我还在学习 Javascript,但是我前段时间用 C 语言写了这个函数,它使用了数学和 while 循环,而不是字符串,所以我为 Javascript 重写了它。也许这可以用递归的方式完成,但是我还没有真正理解这个概念: (这是我能想到的最好的方法。我不确定它能处理多大的数字,当我输入100个数字时它就能处理。

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


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

编辑: 只对整数值有效

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

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

两个数字: 简单的函数,以防需要使用 ECMAScript 6(ES6)的两个或更多数字:

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

问题陈述: 不使用 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;
}

}

注意: 此函数将 忽略的数字后面的小数平均值 ,如果你想用十进制计数,然后删除 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()放进去;

干杯!

这是我的解决方案,它适用于正数和负数。 希望这个能帮上忙

function findDigitAmount(num) {


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


return lengthNumber.length;
}




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

得到长度为

  `${NUM}`.length

其中 NUM 是获取长度的数字

你可以在这个把戏中使用:

(''+number).length
`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));

请使用下面的表达式得到数字的长度。

length = variableName.toString().length

这个解决方案同样适用于负数和浮点数,并且不调用任何昂贵的 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
}
}

对于整数,我们还可以实现连续除以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))

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

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

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

num.toString().length

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

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

注意: 我在这里发帖的原因是,我认为人们在谷歌上搜索这个答案可能也想要一个解决方案,只是得到一个数字的分数长度。