我有一组带小数的字符串数字,例如:23.456
,9.450
,123.01
...我需要检索每个数字的小数位数,知道他们至少有1位小数。
换句话说,retr_dec()
方法应返回以下内容:
retr_dec("23.456") -> 3
retr_dec("9.450") -> 3
retr_dec("123.01") -> 2
在这种情况下,尾随零会计为小数,与此related question不同。
在Javascript中是否有一个简单/交付的方法来实现这一点,还是应该计算小数点位置并计算字符串长度的差异?感谢
答案 0 :(得分:107)
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
答案 1 :(得分:57)
function retr_dec(num) {
return (num.split('.')[1] || []).length;
}
答案 2 :(得分:11)
function retr_dec(numStr) {
var pieces = numStr.split(".");
return pieces[1].length;
}
答案 3 :(得分:4)
由于还没有基于正则表达式的答案:
/\d*$/.exec(strNum)[0].length
请注意,这对于整数来说是“失败”,但根据问题规范,它们永远不会发生。
答案 4 :(得分:3)
您可以通过这种方式获得数字小数部分的长度:
var value = 192.123123;
stringValue = value.toString();
length = stringValue.split('.')[1].length;
它使数字成为一个字符串,将字符串分成两部分(在小数点)并返回拆分操作返回的数组的第二个元素的长度,并将其存储在'length'变量中。
答案 5 :(得分:1)
对当前接受的答案稍作修改,这会增加Number
原型,从而允许所有数字变量执行此方法:
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());
答案 6 :(得分:1)
这里有两个人的混合,但这对我有用。我的代码中的外部案例在这里没有被其他人处理。但是,我已经删除了科学小数位计数器。我会在大学里喜欢这个!
numberOfDecimalPlaces: function (number) {
var match = ('' + number).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
if (!match || match[0] == 0) {
return 0;
}
return match[0].length;
}
答案 7 :(得分:1)
尝试将String.prototype.match()
与RegExp
/\..*/
一起使用,返回匹配字符串.length
的{{1}}
-1
答案 8 :(得分:1)
我必须处理非常小的数字,所以我创建了一个可以处理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>");
答案 9 :(得分:0)
基于利亚姆·米德尔顿的回答,这就是我所做的(没有科学记法):
numberOfDecimalPlaces = (number) => {
let match = (number + "").match(/(?:\.(\d+))?$/);
if (!match || !match[1]) {
return 0;
}
return match[1].length;
};
alert(numberOfDecimalPlaces(42.21));
&#13;
答案 10 :(得分:0)
function decimalPlaces(n) {
if (n === NaN || n === Infinity)
return 0;
n = ('' + n).split('.');
if (n.length == 1) {
if (Boolean(n[0].match(/e/g)))
return ~~(n[0].split('e-'))[1];
return 0;
}
n = n[1].split('e-');
return n[0].length + ~~n[1];
}