Javascript:如何检索*string*数字的小数位数?

我有一组string数字有小数,例如: 23.456 …我需要检索每个数字的小数位数,知道他们至less有一个小数。

换句话说, retr_dec()方法应该返回以下内容:

 retr_dec("23.456") -> 3 retr_dec("9.450") -> 3 retr_dec("123.01") -> 2 

跟这个相关的问题不同的是,在这种情况下,尾部的零计算为小数。

有没有一个简单的/交付的方法来实现这个在Javascript中,或者我应该计算小数点的位置,并计算与string长度的差异? 谢谢

 function decimalPlaces(num) { var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); if (!match) { return 0; } return Math.max( 0, // Number of digits right of decimal point. (match[1] ? match[1].length : 0) // Adjust for scientific notation. - (match[2] ? +match[2] : 0)); } 

额外的复杂性是处理科学记数法

 decimalPlaces('.05') 2 decimalPlaces('.5') 1 decimalPlaces('1') 0 decimalPlaces('25e-100') 100 decimalPlaces('2.5e-99') 100 decimalPlaces('.5e1') 0 decimalPlaces('.25e1') 1 
 function retr_dec(num) { return (num.split('.')[1] || []).length; } 
 function retr_dec(numStr) { var pieces = numStr.split("."); return pieces[1].length; } 

由于还没有正则expression式的答案:

 /\d*$/.exec(strNum)[0].length 

请注意,这个“失败”的整数,但根据问题规范,他们永远不会发生。

你可以通过这种方式获得数字的小数部分:

 var value = 192.123123; stringValue = value.toString(); length = stringValue.split('.')[1].length; 

它使数字成为一个string,将string拆分为两个(小数点),并返回由拆分操作返回的数组的第二个元素的长度,并将其存储在“length”variables中。

目前接受的答案略有修改,这增加了Number原型,从而允许所有数字variables执行此方法:

 if (!Number.prototype.getDecimals) { Number.prototype.getDecimals = function() { var num = this, match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); if (!match) return 0; return Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0)); } } 

它可以像这样使用:

 // Get a number's decimals. var number = 1.235256; console.debug(number + " has " + number.getDecimals() + " decimal places."); // Get a number string's decimals. var number = "634.2384023"; console.debug(number + " has " + parseFloat(number).getDecimals() + " decimal places."); 

利用我们现有的代码,第二种情况也可以很容易地添加到String原型中,如下所示:

 if (!String.prototype.getDecimals) { String.prototype.getDecimals = function() { return parseFloat(this).getDecimals(); } } 

使用这个:

 console.debug("45.2342".getDecimals()); 

在这里有两个其他的混合,但是这对我有效。 我的代码中的外部情况在这里没有被其他人处理。 但是,我已经删除了科学的小数点位置计数器。 我会喜欢uni!

 numberOfDecimalPlaces: function (number) { var match = ('' + number).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); if (!match || match[0] == 0) { return 0; } return match[0].length; } 

尝试使用String.prototype.match()RegExp /\..*/ ,返回。 /\..*/匹配的string-1

 function retr_decs(args) { return /\./.test(args) && args.match(/\..*/)[0].length - 1 || "no decimal found" } console.log( retr_decs("23.456") // 3 , retr_decs("9.450") // 3 , retr_decs("123.01") // 2 , retr_decs("123") // "no decimal found" ) 

我不得不处理非常小的数字,所以我创build了一个可以处理像1e-7这样的数字的版本。

 Number.prototype.getPrecision = function() { var v = this.valueOf(); if (Math.floor(v) === v) return 0; var str = this.toString(); var ep = str.split("e-"); if (ep.length > 1) { var np = Number(ep[0]); return np.getPrecision() + Number(ep[1]); } var dp = str.split("."); if (dp.length > 1) { return dp[1].length; } return 0; } document.write("NaN => " + Number("NaN").getPrecision() + "<br>"); document.write("void => " + Number("").getPrecision() + "<br>"); document.write("12.1234 => " + Number("12.1234").getPrecision() + "<br>"); document.write("1212 => " + Number("1212").getPrecision() + "<br>"); document.write("0.0000001 => " + Number("0.0000001").getPrecision() + "<br>"); document.write("1.12e-23 => " + Number("1.12e-23").getPrecision() + "<br>"); document.write("1.12e8 => " + Number("1.12e8").getPrecision() + "<br>"); 

基于利亚姆·米德尔顿的回答,这是我所做的(没有科学记数法):

 numberOfDecimalPlaces = (number) => { let match = (number + "").match(/(?:\.(\d+))?$/); if (!match || !match[1]) { return 0; } return match[1].length; }; alert(numberOfDecimalPlaces(42.21));