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

У меня есть набор строковых чисел, имеющих десятичные дроби, например:23.456, 9.450, 123.01... Мне нужно получить количество десятичных знаков для каждого числа, зная, что у них есть хотя бы 1 десятичный знак.

Другими словами,retr_dec() Метод должен вернуть следующее:

<code>retr_dec("23.456") -> 3
retr_dec("9.450")  -> 3
retr_dec("123.01") -> 2
</code>

Конечные нули в этом случае считаются десятичными, в отличие от этогосвязанный вопрос.

Есть ли простой / доставленный метод для достижения этого в Javascript или я должен вычислить положение десятичной точки и вычислить разницу с длиной строки? Спасибо

Ответы на вопрос(11)

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

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

Note that this "fails" for integers, but per the problem specification they will never occur.

 16 мая 2012 г., 16:18
Вы правы. Сожалею.
 16 мая 2012 г., 14:40
@LarryBattle Я ценю ваш комментарий и тщательность, но вопрос ясно гласит:"knowing that they have at least 1 decimal", Если по этой причине вы проголосовали за мой правильный ответ, я прошу вас пересмотреть свой голос.
 16 мая 2012 г., 08:41
Не удалось для целых чисел. Тестовые случаи.jsfiddle.net/kAPvw
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];

}
 02 апр. 2018 г., 22:37
Это справится с каждым условием, скорее будь научным или нет
 02 апр. 2018 г., 22:51
Приведение к последовательности и проверка на научную нотацию на самом деле не является предметом этого вопроса (которому почти 6 лет).

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

numberOfDecimalPlaces: function (number) {
    var match = ('' + number).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
    if (!match || match[0] == 0) {
        return 0;
    }
     return match[0].length;
}
 15 февр. 2017 г., 17:41
Если вы удалите научный счетчик десятичных разрядов, вы можете упростить свое регулярное выражение: /(?:\.(\d+))?$/ Кроме того, вы используете match [0] вместо match [1].

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

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

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

 23 мар. 2018 г., 15:45
Ищите научное представление числа перед десятичными знаками. Это будет срабатывать, когда длина чисел 20 и выше
 30 июн. 2017 г., 21:06
Это, безусловно, самый простой ответ на вопрос OP. OP не запрашивает другие обозначения, которые должны быть приняты во внимание (восьмеричный? Hex?)
 19 мая 2017 г., 10:51
ОП заявил, что числа уже являются строками. Ваш ответ не содержит ничего нового, что не было предложено Джеком и Даниэлем Бидулоком.

Небольшое изменение принятого в настоящее время ответа, это добавляет к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());

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"
)

 07 мар. 2017 г., 22:49
@ Ga & # x280; & # x280; & # x28F; Возвращает2 Вотjsfiddle.net/24rqjr83, Вы можете воспроизвести"no decimal found" возвращается в jsfiddle?
 08 мар. 2017 г., 21:28
Это очень странно. Когда я тестировал его вчера, у меня не было нуля. Я проверил ваш jsfiddle и локально, а также, что функция обрабатывает их. Weird. У тебя есть мой голос.
 07 мар. 2017 г., 20:13
К вашему сведению, это не учитывает конечные нули.retr_decs("9.00") // "no decimal found"
Решение Вопроса
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
 04 мая 2012 г., 21:28
Это не так, я просто хотел бы отметить, что''+ было ненужным в этом случае.
 04 мая 2012 г., 20:55
Обратите внимание, что OP уже заявил, что это не число, а строка с числом внутри.
 04 мая 2012 г., 21:40
@Phrogz, понял. Благодарю.
 04 мая 2012 г., 20:57
@Phrogz, я не думаю, что это влияет на достоверность моего ответа, за исключением того, что, возможно, я не должен считать 0 в конце \. (\ D +)
 21 окт. 2015 г., 15:14
@arod,decimalPlaces("1.00") === 2 ноdecimalPlaces(1.00) === 0 так как("" + 1.00) === "1", Функция работает со строковыми представлениями чисел, а не примитивными числовыми значениями, потому что примитивные числовые значения по своей природе не являются десятичными.IEEE 854 didn't make it into EcmaScript 5.
function retr_dec(numStr) {
    var pieces = numStr.split(".");
    return pieces[1].length;
}
 08 июн. 2016 г., 14:26
Стоит отметить, что если ваш номер не является строкой, это не сработает. Чтобы это работалоvar pieces = numStr.toString().split(".");
 08 дек. 2017 г., 08:52
Этот случай выдаст ошибку, если нет десятичной дроби, например:123.
 02 февр. 2015 г., 16:45
Или даже проще: numStr.split (& quot;. & Quot;) [1] .length;
function retr_dec(num) {
  return (num.split('.')[1] || []).length;
}
 04 мая 2012 г., 20:52
@Deleteman К счастью, ОП указалknowing that they have at least 1 decimal
 04 мая 2012 г., 20:53
Это не сработает для действительно небольших чисел, которые печатаются в экспоненциальной записи.
 16 мая 2012 г., 08:42
Сбой, когда совпадений не найдено. Тестовые случаи.jsfiddle.net/kAPvw/1
 26 февр. 2017 г., 09:02
Если число действительно небольшое, например 0,00000001, num.toString () вернет что-то вроде 1e-7, и этот код не будет работать.
 02 мар. 2016 г., 17:25
Работает отлично. Комментарии, говорящие не работают, если в строке нет десятичной дроби, относятся к этому ответу перед редактированием.

Ваш ответ на вопрос