Подтвердить что ты не робот

Javascript: как получить число десятичных знаков числа * string *?

У меня есть набор строковых чисел, имеющих десятичные числа, например: 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 или я должен вычислить позицию десятичной точки и вычислить разницу с длиной строки? Благодаря

4b9b3361

Ответ 1

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

Ответ 2

function retr_dec(num) {
  return (num.split('.')[1] || []).length;
}

Ответ 3

function retr_dec(numStr) {
    var pieces = numStr.split(".");
    return pieces[1].length;
}

Ответ 4

Поскольку ответа на регулярный вызов уже нет:

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

Обратите внимание, что это "не удается" для целых чисел, но по спецификации проблемы они никогда не будут встречаться.

Ответ 5

Вы можете получить длину десятичной части вашего номера следующим образом:

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

Он присваивает номер строке, разбивает строку на две части (в десятичной точке) и возвращает длину второго элемента массива, возвращаемого разделяемой операцией, и сохраняет его в переменной длины.

Ответ 6

Небольшая модификация принятого в настоящее время ответа, это добавляет прототип 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 decimals.
var number = 1.235256;
console.debug(number + " has " + number.getDecimals() + " decimal places.");

// Get a number string 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());

Ответ 7

Немного гибрид двух других здесь, но это сработало для меня. Внешние случаи в моем коде не были обработаны другими здесь. Однако я удалил счетчик научных десятичных знаков. Который я бы любил в uni!

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

Ответ 8

Попробуйте использовать String.prototype.match() с помощью 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"
)

Ответ 9

Мне приходилось иметь дело с очень маленькими числами, поэтому я создал версию, которая может обрабатывать числа, такие как 1е-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>");

Ответ 10

Основываясь на ответе Лиама Миддлтона, вот что я сделал (без научной нотации):

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

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