Удалить незначительные конечные нули из числа? - PullRequest
125 голосов
/ 01 сентября 2010

Я пропустил стандартный вызов API, который удаляет завершающие незначительные нули из числа?

Пример.

var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001

Number.toFixed () и Number.toPrecision () не совсемчто я ищу.

Ответы [ 15 ]

184 голосов
/ 28 октября 2013

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

toFixed без дополнения

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;
113 голосов
/ 01 сентября 2010

Если вы преобразуете его в строку, он не будет отображать никаких завершающих нулей, которые не сохраняются в переменной в первую очередь, поскольку она была создана как число, а не строка.

var n = 1.245000
var noZeroes = n.toString() // "1.245" 
24 голосов
/ 07 декабря 2013

Я впервые использовал комбинацию ответов Маттилиры и Гари:

r=(+n).toFixed(4).replace(/\.0+$/,'')

Результаты:

  • 1234870.98762341: "1234870.9876"
  • 1230009100: "1230009100"
  • 0,0012234: «0,0012»
  • 0,1200234: «0,12»
  • 0,000001231: «0»
  • 0,10001: «0,1000»
  • "asdf": "NaN" (поэтому нет ошибки времени выполнения)

Несколько проблемный случай - 0.10001. Я закончил тем, что использовал эту более длинную версию:

    r = (+n).toFixed(4);
    if (r.match(/\./)) {
      r = r.replace(/\.?0+$/, '');
    }
  • 1234870.98762341: "1234870.9876"
  • 1230009100: "1230009100"
  • 0,0012234: «0,0012»
  • 0,1200234: "0,12"
  • 0,000001231: «0»
  • 0.10001: «0,1»
  • "asdf": "NaN" (поэтому нет ошибки времени выполнения)

Обновление : И это более новая версия Гэри (см. Комментарии):

r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1')

Это дает те же результаты, что и выше.

12 голосов
/ 01 декабря 2014

Метод toFixed при необходимости выполнит соответствующее округление.Также будут добавлены конечные нули, что не всегда идеально.

(4.55555).toFixed(2);
//-> "4.56"

(4).toFixed(2);
//-> "4.00"

Если вы приведете возвращаемое значение к числу, эти конечные нули будут удаленыЭто более простой подход, чем выполнение собственной математики округления или усечения.

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4
6 голосов
/ 20 ноября 2018

Чистый ответ регулярного выражения

n.replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');

Интересно, почему никто не дал один!

6 голосов
/ 29 июня 2017

Мне нужно было решить и эту проблему, когда Django отображал значения десятичного типа в текстовом поле. Например. когда «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;
}
5 голосов
/ 28 августа 2014

У меня были в основном те же требования, и я обнаружил, что для этой функции нет встроенного механизма.

В дополнение к обрезке конечных нулей мне также необходимо было округлить и отформатировать выходные данные для текущей локали пользователя (т. Е. 123 456,789).

Вся моя работа над этим была включена в GlyHub как prettyFloat.js (MIT Licensed): 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 года


Все современные браузеры теперь поддерживают Интерфейс Интерфейса 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"

Для старых браузеров, вы можете использовать этот polyfill: https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en

3 голосов
/ 01 апреля 2019

Вы можете попробовать это, чтобы минимизировать плавающие числа

var n = 0.0000;
n = parseFloat(n.toString()); 

//output n = 0; 
// n = 3.14000; --> n = 3.14;
3 голосов
/ 13 мая 2018

Как насчет просто умножить на один, как это?

var x = 1.234000*1; // becomes 1.234

var y = 1.234001*1; // stays as 1.234001
2 голосов
/ 25 февраля 2015

Ни одно из этих решений не работало для меня для очень маленьких чисел. http://numeraljs.com/ решил это за меня.

parseFloat(0.00000001.toFixed(8));
// 1e-8

numeral(0.00000001).format('0[.][00000000]');
// "0.00000001"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...