多种 AngularJS 货币格式,使用 i18n (Euro, DE)

Posted

技术标签:

【中文标题】多种 AngularJS 货币格式,使用 i18n (Euro, DE)【英文标题】:Multiple AngularJS currency formats, using i18n (Euro, DE) 【发布时间】:2016-04-18 08:28:49 【问题描述】:

我的 Angular 应用需要以不同的格式显示货币,例如:$2.105,10€ - 欧元符号后 + 不同的分隔符 - 这可以通过包含 i18n angular-locale_de-de.js 变体来实现。

问题是我必须根据 JSON 的语言环境值显示格式,这会在应用程序初始化后发生,因此无论 JSON 说什么,货币都保持默认值,而且似乎没有办法将货币显示为 - $12,000 + i18n docs 表示您只能使用一种语言环境。

一种常见的做法是在索引文件中使用angular-locale- + $localevar +.js,我的应用在 ajax 响应之前不知道语言环境,并使用grunt 构建应用。我该如何解决这个问题?

我可以使用任何替代库吗?对 Angular 处理多种格式的难度感到非常沮丧。

这是一个小提琴http://jsfiddle.net/awsd2s5r/

【问题讨论】:

【参考方案1】:

如果您只处理几个语言环境并且不介意开销,只需包含所需的每个语言环境文件并使用插件angular-dynamic-locale 在收到 ajax 响应后通过执行以下操作重新加载语言:

tmhDynamicLocale.set(ajax_reply.locale)

如果您真的关心性能,您还可以使用类似这样的过滤器即时加载所需的语言环境:

(function () 
    'use strict';

    angular.module('app.filter').filter('loadScript', [ '$q', function($q) 
        var loaded = [];
        return function get(link) 
            if (loaded.indexOf(link) !== -1)
                return ;
            loaded.push(link);

            var deferred = $q.defer();

            var s = document.createElement('script');
            s.type = 'text/javascript';
            s.src = link;
            s.async = true;
            s.onreadystatechange = s.onload = function() 
                var state = s.readyState;
                if (!state)
                    deferred.resolve();
                else
                    deferred.reject();
            ;

            document.body.appendChild(s);

            return deferred.promise;
        ;
    ]);

)();

【讨论】:

绝对的传奇,非常感谢你指点我那个插件! : D 将所有区域设置在一个文件中的唯一问题是,只有最后一个区域设置会被加载,并且不能从该文件动态更改。加载新文件有效。无论如何要将它们加载到一个文件中? 不要将所有语言环境放在一个文件中,只需加载您需要的每个语言环境:参见 repo 中的示例:lgalfaso.github.io/angular-dynamic-locale/app.js

以上是关于多种 AngularJS 货币格式,使用 i18n (Euro, DE)的主要内容,如果未能解决你的问题,请参考以下文章

PHP从次要单位格式化多种货币

AngularJS 内置过滤器

AngularJS的除date外的其它 过滤器

AngularJS - 如何在我输入时在文本框上应用货币过滤器?

AngularJS 的那些内置九种过滤器

angularjs