【问题标题】:Using angulars currency filter with an integer of cents使用整数美分的角度货币过滤器
【发布时间】:2016-11-22 10:29:26
【问题描述】:

您可以在互联网上阅读using floats to represent currency is a very bad idea。推荐的最佳实践是使用表示美分的整数。这样您就不会遇到任何精度问题,尤其是在您进行一些计算时。

由于我很天真而且过于乐观,我选择了(尽管有警告)浮动来代表我的应用程序中的货币。一开始还挺顺利的。现在我遇到了各种各样的问题(尤其是比较问题),想从浮点数切换到整数。

不幸的是,angular 不支持将整数整数作为货币过滤器的输入(至少据我所知)。我有点惊讶,到目前为止似乎没有人想出这个(在 github 上没有相应的问题,在 SO 上也没有任何问题等)。

有什么最佳做法吗?你能想到像这样的简单过滤器可能有什么缺点吗:

angular
    .module('myApp')
    .filter('cents', ['$filter', function($filter) {
        return function(cents, symbol, fractionSize) {
            var asFloat = cents / 100;
            return $filter('currency')(asFloat, symbol, fractionSize);
        };
    }]);

【问题讨论】:

  • 您期望的输入/输出是什么?
  • 当前输入:(float) 5.97 输出:5,97 €。想要的输入:(int) 597 想要的输出:5,97 €

标签: javascript angularjs precision currency


【解决方案1】:

不利的一面可能与 Angular 一开始不支持扔美分的原因相同:not all currencies use 100 as their base(向下扫描该表的“数字到基本”列。)

【讨论】:

  • 哇,这是一个我不知道的非常有趣的事实!谢谢你。但在我看来,到目前为止还没有反对“扔美分”的论据。您指出的问题可以通过引入可选变量(所有 100 种货币的默认设置)轻松解决。我认为使用浮动货币是一个好主意还是坏主意真的没有争议。到目前为止,使用美分的优势远远超过了另一个变量的劣势。
  • 出于好奇:您是否有关于该主题的实际讨论的链接?不幸的是,我还没有找到任何关于为什么 angular 不支持分整数。
  • 不,没有链接。但请注意,货币过滤器不接受货币符号或任何其他语言环境提示,因此它不知道您的数值代表什么货币,因此无法对其进行规范化。我想可能值得指出现在可用的标准Intl.NumberFormat 选项:new Intl.NumberFormat(navigator.language, {style:'currency',currency:'EUR'}).format(1234.56)
  • 确实如此:默认情况下,货币过滤器使用 $locale 服务来确定货币和分数符号(请参阅我的回答 here)。您可以将符号以及分数大小指定为变量 (docs.angularjs.org/api/ng/filter/currency)。因此,也可以指定除以的因子。
  • 我的意思是货币过滤器没有参数来识别 this 金额的货币(在调用时),允许您正确呈现各种货币的不同金额,而无需了解 (a) 主要到次要货币转换逻辑,以及 (b) 要显示的货币符号。 Intl.NumberFormat 使用带有 ISO 货币代码的 currency 参数正确处理。 (角度货币过滤器是在Intl 最终确定之前实现的......)
猜你喜欢
  • 2015-09-16
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 2018-07-18
相关资源
最近更新 更多