Angular.js - обертывание символа валюты и десятичных чисел в промежутках

Можете ли вы сделать что-то подобное в angular?

enter image description here

Невозможно это сделать, поскольку не анализирует теги или что-то еще

{{ 10000 | currency:"<span>$</span>" }}

http://plnkr.co/edit/WluYoe2Ltmhmhvr8BBWX?p=preview

не говоря уже о некотором отдельном десятичном числе.

Идеальный результат:

1 000 000<span class="dec">,00</span><span class="cur">€</span>

Невозможно сделать какие-либо настройки фильтра, это..?

Я мог бы попробовать и изменить фильтр валюты angular и функцию formatNumber, но он все равно будет воспринимать его как текст, а не элемент span.

//редактируем вы действительно можете это сделать http://plnkr.co/edit/dcEhHi8sp43564ZvC4D1?p=preview

<p ng-bind-html-unsafe="10000 | currency:'<span>$</span>'"></p>

по-прежнему не знает о десятичных знаках, хотя

Ответ 1

Фактически это возможно сделать

<p ng-bind-html-unsafe="10000 | currency:'<span>$</span>'"></p>

или оберните его вокруг фильтра национальной валюты, как этот

app.filter('currencys', ['$filter', '$locale', 
    function($filter, $locale) {
        return function (num) {
            var sym = $locale.NUMBER_FORMATS.CURRENCY_SYM;
            return $filter('currency')(num, '<span>'+ sym +'</span>');
        };
    }
]);

а затем используйте его так:

<span ng-bind-html-unsafe="10000 | currencys"></span>

Ответ 2

Вы можете создать собственный фильтр

app.filter('euro', function () {
    return function (text) {
        text = text.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1 ");
        var t = text + '<span class="desc">,00</span><span class="cur">€</span>';
        return t;
    };
});

<span ng-bind-html-unsafe="1000000 | euro"></span>

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

1 000 000,00€

Рабочий демонстрационный пример

(Регулярное выражение опубликовано @Paul Creasey в его ответе fooobar.com/questions/47178/...)

Ответ 3

В некоторых локалях есть префикс валюты, некоторые с пометкой, например. "сто евро" будет предоставлено "100 евро" или "100 евро". Что тогда?

Если вы не против делать синтаксический разбор, но читайте дальше:

Служба $locale содержит символы, необходимые для форматирования валюты:

$locale.NUMBER_FORMATS.CURRENCY_SYM
$locale.NUMBER_FORMATS.DECIMAL_SEP

(И есть более подробная информация в $locale.NUMBER_FORMATS.PATTERNS[] - значение в позиции [1] для валют)

Вы можете создать директиву, которая использует фильтр currency, чтобы получить исходную форматированную строку, например. "1 000 000,50 €" затем выполните поиск $locale.NUMBER_FORMATS.CURRENCY_SYM и замените его на <span>{{ $locale.NUMBER_FORMATS.CURRENCY_SYM }}</span>, сделайте что-то похожее для десятичного разделителя и затем установите innerHTML элемента.