Вопрос по decimal, javascript, string, numbers – Javascript: Как получить количество десятичных знаков числа * string *?

55

У меня есть набор строковых чисел, имеющих десятичные дроби, например: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   ответов
4

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

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

@LarryBattle Я ценю ваш комментарий и тщательность, но вопрос ясно гласит:"knowing that they have at least 1 decimal", Если по этой причине вы проголосовали за мой правильный ответ, я прошу вас пересмотреть свой голос.
Вы правы. Сожалею.
Не удалось для целых чисел. Тестовые случаи.jsfiddle.net/kAPvw
1

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

numberOfDecimalPlaces: function (number) {
    var match = ('' + number).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
    if (!match || match[0] == 0) {
        return 0;
    }
     return match[0].length;
}
Если вы удалите научный счетчик десятичных разрядов, вы можете упростить свое регулярное выражение: /(?:\.(\d+))?$/ Кроме того, вы используете match [0] вместо match [1].
106
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
@Phrogz, я не думаю, что это влияет на достоверность моего ответа, за исключением того, что, возможно, я не должен считать 0 в конце \. (\ D +)
Это не так, я просто хотел бы отметить, что''+ было ненужным в этом случае.
@arod,decimalPlaces("1.00") === 2 ноdecimalPlaces(1.00) === 0 так как("" + 1.00) === "1", Функция работает со строковыми представлениями чисел, а не примитивными числовыми значениями, потому что примитивные числовые значения по своей природе не являются десятичными.IEEE 854 didn't make it into EcmaScript 5.
@Phrogz, понял. Благодарю.
Обратите внимание, что OP уже заявил, что это не число, а строка с числом внутри.
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>");

11
function retr_dec(numStr) {
    var pieces = numStr.split(".");
    return pieces[1].length;
}
Этот случай выдаст ошибку, если нет десятичной дроби, например:123.
Стоит отметить, что если ваш номер не является строкой, это не сработает. Чтобы это работалоvar pieces = numStr.toString().split(".");
Или даже проще: numStr.split (& quot;. & Quot;) [1] .length;
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];

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

вот что я сделал (без научной записи):

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

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

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());
3

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

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

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

Это, безусловно, самый простой ответ на вопрос OP. OP не запрашивает другие обозначения, которые должны быть приняты во внимание (восьмеричный? Hex?)
ОП заявил, что числа уже являются строками. Ваш ответ не содержит ничего нового, что не было предложено Джеком и Даниэлем Бидулоком.
Ищите научное представление числа перед десятичными знаками. Это будет срабатывать, когда длина чисел 20 и выше
1

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

Это очень странно. Когда я тестировал его вчера, у меня не было нуля. Я проверил ваш jsfiddle и локально, а также, что функция обрабатывает их. Weird. У тебя есть мой голос.
@ Ga & # x280; & # x280; & # x28F; Возвращает2 Вотjsfiddle.net/24rqjr83, Вы можете воспроизвести"no decimal found" возвращается в jsfiddle?
К вашему сведению, это не учитывает конечные нули.retr_decs("9.00") // "no decimal found"
56
function retr_dec(num) {
  return (num.split('.')[1] || []).length;
}
@Deleteman К счастью, ОП указалknowing that they have at least 1 decimal
Сбой, когда совпадений не найдено. Тестовые случаи.jsfiddle.net/kAPvw/1
Работает отлично. Комментарии, говорящие не работают, если в строке нет десятичной дроби, относятся к этому ответу перед редактированием.
Если число действительно небольшое, например 0,00000001, num.toString () вернет что-то вроде 1e-7, и этот код не будет работать.
Это не сработает для действительно небольших чисел, которые печатаются в экспоненциальной записи.

Похожие вопросы