【问题标题】:angular.js - wrapping the currency symbol and decimal numbers in spansangular.js - 用西班牙语包装货币符号和十进制数字
【发布时间】:2013-09-17 00:24:04
【问题描述】:

你能用 Angular 做这样的事情吗?

这样做不太可能,因为不解析标签或其他东西

{{ 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>

仍然对小数一无所知

【问题讨论】:

    标签: javascript angularjs currency


    【解决方案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>');
            };
        }
    ]);
    

    然后像这样使用它

    &lt;span ng-bind-html-unsafe="10000 | currencys"&gt;&lt;/span&gt;

    【讨论】:

      【解决方案2】:

      有些语言环境有货币符号前缀,有些是后缀,例如“一百欧元”将呈现为“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 并将其替换为&lt;span&gt;{{ $locale.NUMBER_FORMATS.CURRENCY_SYM }}&lt;/span&gt;,对小数分隔符执行类似操作,然后设置元素的innerHTML

      【讨论】:

      • $locale 不存储用户当前语言环境的值吗?在向不同地区的人显示欧元时,可能会将其放在价值的前面。它不是特定于货币,而是特定于用户。
      • $locale 保留了一个描述 Angular 理解的当前语言环境的数据结构。从来没有写过格式取决于货币。
      • 所以它可以显示 €1,000.001.000,00$ 取决于区域设置
      • 是的。不幸的是还有另一个问题,用户语言环境和系统货币的分离。说明:我是希腊人,所以货币格式是“1.234,56 ¤”(¤ 是任何货币)。对于希腊语言环境,这是 €。如果我从美国购买,货币是 $,但我的首选语言环境仍然是 el,该怎么办?在这种情况下,Angular 的$locale 是不够的——将“一百美元”显示为“100 欧元”。也许在这种情况下你必须破解$locale.NUMBER_FORMATS.CURRENCY_SYM
      【解决方案3】:

      您可以创建自定义过滤器

      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€
      

      Working Demo

      (正则表达式由@Paul Creasey 在他的回答https://stackoverflow.com/a/1990554/304319 中发布)

      【讨论】:

      • 是的,但这不适用于 $locale。使用 $locale,货币符号可能位于首位,小数分隔符可能是一个点,或者根本没有小数等等。您发布的内容与我在没有任何角度过滤器的情况下使用 10000&lt;span class="dec"&gt;,00&lt;/span&gt;&lt;span class="cur"&gt;€&lt;/span&gt; 所做的几乎相同
      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      相关资源
      最近更新 更多