57

我有一组带小数的字符串数字,例如:23.456, 9.450, 123.01... 我需要检索每个数字的小数位数,知道它们至少有 1 个小数。

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

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

在这种情况下,尾随零确实算作小数,与此相关问题不同。

是否有一种简单/交付的方法可以在 Javascript 中实现这一点,或者我应该计算小数点位置并计算与字符串长度的差异?谢谢

4

11 回答 11

114
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
于 2012-05-04T18:53:36.993 回答
59
function retr_dec(num) {
  return (num.split('.')[1] || []).length;
}
于 2012-05-04T18:51:12.510 回答
10
function retr_dec(numStr) {
    var pieces = numStr.split(".");
    return pieces[1].length;
}
于 2012-05-04T18:53:14.170 回答
5

由于还没有基于正则表达式的答案:

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

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

于 2012-05-04T18:52:45.683 回答
3

您可以通过以下方式获得数字小数部分的长度:

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

它将数字变成字符串,将字符串一分为二(在小数点处),并返回拆分操作返回的数组的第二个元素的长度,并将其存储在“length”变量中。

于 2017-05-19T07:40:59.747 回答
2

尝试使用String.prototype.match()with RegExp /\..*/,返回.length匹配的字符串-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"
)

于 2016-01-13T15:36:16.900 回答
2

我必须处理非常小的数字,所以我创建了一个可以处理像 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>");

于 2017-02-26T08:30:28.913 回答
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());
于 2013-09-16T00:32:06.573 回答
1

有点混合了其他两个,但这对我有用。我的代码中的外部案例不是由这里的其他人处理的。但是,我删除了科学小数位计数器。我在大学会喜欢的!

numberOfDecimalPlaces: function (number) {
    var match = ('' + number).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
    if (!match || match[0] == 0) {
        return 0;
    }
     return match[0].length;
}
于 2015-02-02T15:19:46.673 回答
0

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

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

            return match[1].length;
        };
        
alert(numberOfDecimalPlaces(42.21));

于 2017-02-15T16:56:46.453 回答
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];

}
于 2018-04-02T20:37:11.200 回答