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 или я должен вычислить позицию десятичной точки и вычислить разницу с длиной строки? Благодаря
Ответы
Ответ 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));