Чи пропустив я стандартний виклик API, який видаляє з числа незрозумілі нулі?
Вих.
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed () та Number.toPrecision () - не зовсім те, що я шукаю.
parseFloat(n)
?
Чи пропустив я стандартний виклик API, який видаляє з числа незрозумілі нулі?
Вих.
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed () та Number.toPrecision () - не зовсім те, що я шукаю.
parseFloat(n)
?
Відповіді:
Якщо ви перетворите його в рядок, він не відображатиме ніяких задніх нулів, які не зберігаються в змінній, в першу чергу, оскільки вони були створені у вигляді числа, а не рядка.
var n = 1.245000
var noZeroes = n.toString() // "1.245"
var n = 1.245000000000001
(передбачається , що вона незначна , щоб представити користувач)
У мене був подібний екземпляр, де я хотів використовувати .toFixed()
там, де потрібно, але я не хотів, щоб тампон був, коли його не було. Тому я в кінцевому підсумку використовував parseFloat спільно з toFixed.
toFIX без прокладки
parseFloat(n.toFixed(4));
Ще один варіант, який робить майже те саме.
Ця відповідь може допомогти вашому рішенню
Number(n.toFixed(4));
toFixed
округлятиме / прошиває число до певної довжини, але також перетворює його в рядок. Перетворення цього списку на числовий тип не тільки зробить число безпечнішим для арифметичного використання, але й автоматично скине будь-які проміжні 0. Наприклад:
var n = "1.234000";
n = parseFloat(n);
// n is 1.234 and in number form
Тому що навіть якщо ви визначите число із задніми нулями, вони скидаються.
var n = 1.23000;
// n == 1.23;
parseFloat(n).toFixed(4);
замість вашої реальної відповіді. Мені шкода.
+(n.toFixed(4))
?
Я вперше застосував поєднання відповідей матті-ліри та Ґері:
r=(+n).toFixed(4).replace(/\.0+$/,'')
Результати:
Дещо проблематичний випадок - 0,10001. Я закінчив використовувати цю довшу версію:
r = (+n).toFixed(4);
if (r.match(/\./)) {
r = r.replace(/\.?0+$/, '');
}
Оновлення : І це нова версія Гаррі (див. Коментарі):
r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1')
Це дає ті ж результати, що і вище.
toFixed(4).replace(/([0-9]+(\.[1-9]+)?)(\.?0+$)/,"$1")
([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)
replace(/[,.][1-9]+(0+)/,'')
?
При необхідності toFixed
метод здійснить відповідне округлення. Це також додасть кінцеві нулі, що не завжди ідеально.
(4.55555).toFixed(2);
//-> "4.56"
(4).toFixed(2);
//-> "4.00"
Якщо ви повернете значення, яке повернеться до числа, ці нульові знаки будуть відмінені. Це простіший підхід, ніж робити власну математику округлення чи укорочення.
+(4.55555).toFixed(2);
//-> 4.56
+(4).toFixed(2);
//-> 4
toFixed
дзвінка). це дивний край UX.
У мене були в основному однакові вимоги, і я виявив, що для цього функціоналу немає вбудованого механізму.
На додаток до обрізки кінцевих нулів, у мене також була необхідність округлення та форматування виводу для поточного локального пункту користувача (тобто 123456.789).
Вся моя робота над цим була включена як доситьFloat.js (ліцензований MIT) на GitHub: https://github.com/dperish/prettyFloat.js
Приклади використання:
prettyFloat(1.111001, 3) // "1.111"
prettyFloat(1.111001, 4) // "1.111"
prettyFloat(1.1111001, 5) // "1.1111"
prettyFloat(1234.5678, 2) // "1234.57"
prettyFloat(1234.5678, 2, true) // "1,234.57" (en-us)
Оновлено - серпень 2018 року
Усі сучасні браузери тепер підтримують API інтернаціоналізації ECMAScript , який забезпечує порівняння мовних рядків, форматування чисел та форматування дати та часу.
let formatters = {
default: new Intl.NumberFormat(),
currency: new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
whole: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
oneDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 1, maximumFractionDigits: 1 }),
twoDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2 })
};
formatters.twoDecimal.format(1234.5678); // result: "1,234.57"
formatters.currency.format(28761232.291); // result: "$28,761,232"
Для старих веб-переглядачів ви можете використовувати цю поліграфію: https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en
Ви можете спробувати цей, щоб мінімізувати плаваючі числа
var n = 0.0000;
n = parseFloat(n.toString());
//output n = 0;
// n = 3.14000; --> n = 3.14;
Чиста відповідь на регулярний вираз
n.replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');
Цікаво, чому ніхто не дав!
Мені також потрібно було вирішити цю проблему, коли Джанго відображав значення десяткових типів у текстовому полі. Наприклад, коли значення було "1". Це показало б "1.00000000". Якщо значення "1.23" було б, воно відображало б "1.23000000" (у випадку встановлення "decimal_places" 8)
Використання parseFloat не було для мене варіантом, оскільки можливо, воно не повертає точно таке ж значення. toFixed не був варіантом, оскільки я не хотів нічого округляти, тому створив функцію:
function removeTrailingZeros(value) {
value = value.toString();
# if not containing a dot, we do not need to do anything
if (value.indexOf('.') === -1) {
return value;
}
# as long as the last character is a 0 or a dot, remove it
while((value.slice(-1) === '0' || value.slice(-1) === '.') && value.indexOf('.') !== -1) {
value = value.substr(0, value.length - 1);
}
return value;
}
Жодне з цих рішень не працювало для мене в дуже малій кількості. http://numeraljs.com/ вирішив це для мене.
parseFloat(0.00000001.toFixed(8));
// 1e-8
numeral(0.00000001).format('0[.][00000000]');
// "0.00000001"
Якщо ви не можете використовувати Floats з будь-якої причини (як, наприклад, гроші-поплавці) і вже починаєте з рядка, що представляє правильне число, ви можете знайти це рішення зручним. Він перетворює рядок, що представляє число, в рядок, що представляє число без введення нулів.
function removeTrailingZeroes( strAmount ) {
// remove all trailing zeroes in the decimal part
var strDecSepCd = '.'; // decimal separator
var iDSPosition = strAmount.indexOf( strDecSepCd ); // decimal separator positions
if ( iDSPosition !== -1 ) {
var strDecPart = strAmount.substr( iDSPosition ); // including the decimal separator
var i = strDecPart.length - 1;
for ( ; i >= 0 ; i-- ) {
if ( strDecPart.charAt(i) !== '0') {
break;
}
}
if ( i=== 0 ) {
return strAmount.substring(0, iDSPosition);
} else {
// return INTPART and DS + DECPART including the rightmost significant number
return strAmount.substring(0, iDSPosition) + strDecPart.substring(0,i + 1);
}
}
return strAmount;
}
Прочитавши всі відповіді - та коментарі - я закінчив це:
function isFloat(n) {
let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n)) : n;
return number;
}
Я знаю, що використання eval
якось може бути шкідливим, але це мені дуже допомогло.
Так:
isFloat(1.234000); // = 1.234;
isFloat(1.234001); // = 1.234001
isFloat(1.2340010000); // = 1.234001
Якщо ви хочете обмежити десяткові знаки, використовуйте toFixed()
як вказували інші.
let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n).toFixed(3)) : n;
Це воно.
Мені потрібно було видалити будь-які знаки нуля, але зберегти принаймні 2 десяткові дроби, включаючи будь-які нулі.
Числа, з якими я працюю, складають 6 десяткових рядків чисел, породжених .toFixed (6).
Очікуваний результат:
var numstra = 12345.000010 // should return 12345.00001
var numstrb = 12345.100000 // should return 12345.10
var numstrc = 12345.000000 // should return 12345.00
var numstrd = 12345.123000 // should return 12345.123
Рішення:
var numstr = 12345.100000
while (numstr[numstr.length-1] === "0") {
numstr = numstr.slice(0, -1)
if (numstr[numstr.length-1] !== "0") {break;}
if (numstr[numstr.length-3] === ".") {break;}
}
console.log(numstr) // 12345.10
Логіка:
Запустити функцію циклу, якщо останній символ рядка дорівнює нулю.
Видаліть останній символ та оновіть змінну рядка.
Якщо оновлений рядок останнього символу не дорівнює нулю, закінчуємо цикл.
Якщо оновлений рядок від третього до останнього символу є плаваючою точкою, кінцевим циклом.
1.234000 === 1.234
.