Формат номера, чтобы всегда показывать 2 десятичных знака - PullRequest
652 голосов
/ 26 мая 2011

Я хотел бы отформатировать свои числа, чтобы всегда отображать 2 десятичных знака с округлением, где это применимо.

Примеры:

number     display
------     -------
1          1.00
1.341      1.34
1.345      1.35

Я использовал это:

parseFloat(num).toFixed(2);

Но он отображает 1 как 1, а не 1.00.

Ответы [ 28 ]

6 голосов
/ 21 июня 2016

Преобразовать число в строку, сохраняя только два десятичных знака:

var num = 5.56789;
var n = num.toFixed(2);

Результат n будет:

5.57
4 голосов
/ 26 мая 2011

Вы ищете пол?

var num = 1.42482;
var num2 = 1;
var fnum = Math.floor(num).toFixed(2);
var fnum2 = Math.floor(num2).toFixed(2);
alert(fnum + " and " + fnum2); //both values will be 1.00
3 голосов
/ 26 мая 2011

Если требуется конкретное форматирование, вы должны написать собственную процедуру или использовать библиотечную функцию, которая делает то, что вам нужно. Основная функциональность ECMAScript обычно недостаточна для отображения отформатированных чисел.

Подробное описание округления и форматирования приведено здесь: http://www.merlyn.demon.co.uk/js-round.htm#RiJ

Как правило, округление и форматирование должны выполняться только как последний шаг перед выводом. Это может привести к неожиданно большим ошибкам и разрушению форматирования.

3 голосов
/ 18 сентября 2015

Вот также универсальная функция, которая может форматировать любое количество знаков после запятой:

function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}
2 голосов
/ 20 октября 2017

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>
2 голосов
/ 19 августа 2015
function currencyFormat (num) {
    return "$" + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
}

console.info(currencyFormat(2665));   // $2,665.00
console.info(currencyFormat(102665)); // $102,665.00
1 голос
/ 28 мая 2019

Просто наткнитесь на этот самый длинный поток, ниже мое решение:

parseFloat (Math.round ((parseFloat (num * 100)). ToFixed (2)) / 100) .toFixed (2)

Дайте мне знать, если кто-нибудь может проткнуть дыру

1 голос
/ 19 ноября 2018

Для современных браузеров используйте toLocaleString:

var num = 1.345;
num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });

Укажите тег локали в качестве первого параметра для управления десятичным разделителем . Для точки используйте, например, английский язык США:

num.toLocaleString("en-US", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

, что дает:

1,35

В большинстве стран Европы в качестве десятичного разделителя используется запятая, поэтому, если вы, например, используете язык Швеции / Швеции:

num.toLocaleString("sv-SE", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

это даст:

1.35

1 голос
/ 12 октября 2018

Мне пришлось выбирать между преобразованиями parseFloat () и Number (), прежде чем я смог сделать вызов toFixed ().Вот пример форматирования чисел после захвата пользовательского ввода.

HTML:

<input type="number" class="dec-number" min="0" step="0.01" />

Обработчик события:

$('.dec-number').on('change', function () {
     const value = $(this).val();
     $(this).val(value.toFixed(2));
});

Приведенный выше код приведет к исключению TypeError,Обратите внимание, что хотя тип ввода html - «число», пользовательский ввод - это тип данных «строка».Однако функция toFixed () может быть вызвана только для объекта, который является Number.

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

$('.dec-number').on('change', function () {
     const value = Number($(this).val());
     $(this).val(value.toFixed(2));
});

Причина, по которой я предпочитаю выполнять приведение с Number () против parseFloat () потому, что мне не нужно выполнять дополнительную проверку ни для пустой входной строки, ни для значения NaN.Функция Number () автоматически обработает пустую строку и преобразует ее в ноль.

1 голос
/ 26 мая 2011

Вы не даете нам полную картину.

javascript:alert(parseFloat(1).toFixed(2)) показывает 1,00 в моих браузерах, когда я вставляю его в строку адреса. Однако, если вы сделаете что-то с этим потом, оно вернется.

var num = 2
document.getElementById('spanId').innerHTML=(parseFloat(num).toFixed(2)-1)


shows 1 and not 1.00
...