Форматирование чисел в строках шаблонов (Javascript-ES6)

мне было интересно, можно ли форматировать числа в строках шаблонов Javascript, например, что-то вроде:

var n = 5.1234;
console.log(`This is a number: $.2d{n}`);
// -> 5.12

или, возможно,

var n = 5.1234;
console.log(`This is a number: ${n.toString('.2d')}`);
// -> 5.12

этот синтаксис не работает, это просто иллюстрация, что я ищу.

Я знаю о таких инструментах, как sprintf С underscore.string, но это похоже на то, что JS должен быть в состоянии сделать из коробки, особенно учитывая силу шаблона веревка.

редактировать

как указано выше, я уже знаю о сторонних инструментах (например, sprintf) и настраиваемых функциях для этого. Похожие вопросы (например,JavaScript эквивалентен printf / String.Формат) не упоминайте строки шаблона вообще, вероятно, потому, что их спросили До того, как строки шаблона ES6 были вокруг. Мой вопрос специфичен для ES6 и не зависит от реализации. Я вполне счастлив принять ответ "Нет"., это невозможно", если это так, но что было бы здорово, это либо информация о новой функции ES6, которая предоставляет это, либо некоторое представление о том, находится ли такая функция на своем пути.

5 ответов


нет, ES6 не вводит никаких новых функций форматирования чисел, вам придется жить с существующими .toExponential(fractionDigits), .toFixed(fractionDigits), .toPrecision(precision), .toString([radix]) и toLocaleString(…) (который был обновлен, чтобы дополнительно поддерживать стандарт ECMA-402, хотя).
Строки шаблона не имеют ничего общего с форматированием Чисел, Они просто desugar для вызова функции( если помечены) или конкатенации строк (неисполнение.)

если эти Number методы не достаточно для вас, вам придется свернуть свой собственный. Вы можете, конечно, написать свою функцию форматирования в качестве тега строки шаблона, если хотите это сделать.


вы должны иметь возможность использовать метод toFixed () числа:

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

вы можете использовать функции тегов es6. Не знаю, готов ли я к этому.

Это может выглядеть так:

num`This is a number: $.2d{n}`

подробнее:


Если вы хотите использовать функции тегов ES6, вот как будет выглядеть такая функция тегов,

function d2(pieces) {
    var result = pieces[0];
    var substitutions = [].slice.call(arguments, 1);

    for (var i = 0; i < substitutions.length; ++i) {
        var n = substitutions[i];

        if (Number(n) == n) {
            result += Number(substitutions[i]).toFixed(2);
        } else {
            result += substitutions[i];
        }

        result += pieces[i + 1];
    }

    return result;
}

который затем может быть применен к строке шаблона таким образом,

d2`${some_float} (you can interpolate as many floats as you want) of ${some_string}`;

это отформатирует float и оставит строку в покое.


в то время как форматирование с использованием интерполяции строки шаблона недоступно в качестве встроенного, вы можете получить эквивалентное поведение с Intl.NumberFormat:

const format = (num, fraction = 2) => new Intl.NumberFormat([], {
  minimumFractionDigits: fraction,
  maximumFractionDigits: fraction,
}).format(num);

format(5.1234); // -> '5.12'

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

(9.999).toFixed(2) // -> '10.00'

new Intl.NumberFormat([], {
  minimumFractionDigits: 2,
  maximumFractionDigits: 2, // <- implicit rounding!
}).format(9.999) // -> '10.00'