Функция Mustache.js для формата номера - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь использовать mustache.js в своем коде jquery.
К сожалению, у меня проблема с форматированием числового значения с помощью функции.

var data = {
  "price": 12000.00,
  "format": function () {
     return function (text, render) {
       return Number( render(text) ).toLocaleString( "it-IT", { maximumFractionDigits: 2 } ) + ' €';
     }
   }
}

var template = "{{#format}}Formatted price : {{price}} {{/format}}";
var text = Mustache.render(template, data);
//output --> NaN €

Я пытался использовать parseInt вместоНомер, но с тем же результатом.
Как я мог это сделать?Спасибо

1 Ответ

0 голосов
/ 18 февраля 2019

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

Процесс для шаблона Mustache, подобного этому {{#format}}{{price}}{{/format}}, следующий:

  • * вызывается 1009 *, он получает необработанный текст ('{{price}}') в качестве аргумента # 1 и специальную функцию render() в качестве аргумента # 2.
  • Вы вызываете render(text) (это приводит к тому, что{{price}} оценивает как)
  • Вы вносите изменения в этот результат и возвращаете его.

Это означает, что в вашей модели есть число.render(text) превращает его в строку.Затем вам нужно снова разобрать эту строку в число и переформатировать ее в соответствии с вашей локалью.Это очень окольный способ сделать это, будет намного проще, если вы отформатируете число заранее и не пытаетесь подковать это в Усы.

Для потомков, вот как это будет выглядеть при использовании Усов:

var data = {
  price: 12000.5,
  format: function () {
    return function (text, render) {
      var result = render(text);
      return parseFloat(result).toLocaleString("it-IT", {
        minimumFractionDigits: 2,
        maximumFractionDigits: 2
      });
    }
  }
}

var template = "Formatted price: {{#format}}{{price}}{{/format}} €";
var result = Mustache.render(template, data);
document.querySelector("#output").textContent = result;
<script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/3.0.1/mustache.min.js"></script>

<div id="output"></div>
...