使用JavaScript获取位数

bit*_*fox 103 javascript count digits

正如我的帖子标题所示,我想知道有多少位数var number.例如:如果number = 15;我的函数应该返回2.目前,它看起来像这样:

function getlength(number) {
  return number.toString().length();
}
Run Code Online (Sandbox Code Playgroud)

但Safari表示,由于TypeError:

'2' is not a function (evaluating 'number.toString().length()')
Run Code Online (Sandbox Code Playgroud)

如您所见,'2'实际上是正确的解决方案.但为什么呢not a function

Vis*_*ioN 204

length是一种财产,而不是一种方法.你无法调用它,因此你不需要括号():

function getlength(number) {
    return number.toString().length;
}
Run Code Online (Sandbox Code Playgroud)

更新:如评论中所述,上述示例不适用于浮点数.为了使它工作,我们可以String(number).replace('.', '').length用正则表达式去掉句号,或者用正则表达式计算数字:String(number).match(/\d/g).length.

就速度而言,获得给定数字中数字位数的最快方法是以数学方式进行.对于正整数,有一个很好的算法log10:

var length = Math.log(number) * Math.LOG10E + 1 | 0;  // for positive integers
Run Code Online (Sandbox Code Playgroud)

对于所有类型的整数(包括底片),有一个来自@ Mwr247的精彩优化解决方案,但要小心使用Math.log10,因为许多传统浏览器不支持它.因此,更换Math.log10(x)Math.log(x) * Math.LOG10E将解决兼容性问题.

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

var length = (number + '').replace('.', '').length;  // for floats
Run Code Online (Sandbox Code Playgroud)

  • 没有数字的好技术,但是,如果它是一个分数,即12.5,那么你的函数将返回4而不是3 ...... (3认同)
  • 否则只需使用`number.toString().match(/\d/g).length`. (3认同)

Mwr*_*247 58

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

function numDigits(x) {
  return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}
Run Code Online (Sandbox Code Playgroud)

以及上面的优化版本(更高效的按位操作):

function numDigits(x) {
  return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}
Run Code Online (Sandbox Code Playgroud)

基本上,我们首先获取输入的绝对值,以允许负值正常工作.然后我们通过log10操作来给出输入的10的幂(如果你在另一个基础上工作,你将使用该基数的对数),这是数字的位数.然后我们将输出置于仅获取整数部分.最后,我们使用max函数来固定十进制值(0到1之间的任何小数值只返回1而不是负数),并在最终输出中加1以获得计数.

以上假设(根据您的示例输入)您希望计算整数中的位数(因此12345 = 5,因此12345.678 = 5).如果您想计算值中的总位数(所以12345.678 = 8),那么在上面任一函数中的'return'之前添加它:

x = Number(String(x).replace(/[^0-9]/g, ''));
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是迄今为止最好的答案,但也许不是人们想要的...... (4认同)
  • 注意:Math.log10是ES6函数https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10 (3认同)
  • @ Tx3好注意!值得庆幸的是,自从ES1以来,`Math.LOG10E`已经存在,这意味着`Math.log(x)*Math.LOG10E`将兼容. (2认同)
  • @lokhmakov那是因为你给出的第二个数字超出了JavaScript的最大32位整数值,按位运算符(^、>>、|)无法正确处理。 (2认同)
  • 真的。人们应该预料到 JS 只适用于最大安全整数,而这个数字比几乎任何人所需的都要大得多。我正在开发一个具有非常大的数字的游戏,并且由于该限制而无法使用优化的代码,并且我认为我应该发表评论以防止类似船上的其他人稍后破坏代码。顺便说一句,答案很好。 (2认同)

str*_*ics 19

由于这是在谷歌上搜索"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);
Run Code Online (Sandbox Code Playgroud)

产量

3 4
Run Code Online (Sandbox Code Playgroud)

  • 一个快速的jsperf表明,这也快得多(如10倍或更多):http://jsperf.com/number-tostring-vs-number (4认同)
  • 笔记!也将点算作数字。(以 dec_number 为单位) (3认同)

小智 10

得到长度很简单

  `${NUM}`.length
Run Code Online (Sandbox Code Playgroud)

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


Ida*_*dan 7

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

(''+number).length
Run Code Online (Sandbox Code Playgroud)