3

我正在向电子商务应用程序添加多币种支持。我解决问题的方法是将应用程序保持在其基础货币中,并让模板在显示价格时调用 priceDisplay() 函数/插件。因此,模板继续接收美元金额的价格。priceDisplay 函数在需要时正确转换价格,并根据查看器设置添加正确的美元或欧元符号,存储在会话中。在提交订单时,应用程序将以美元金额以及currencyCode 和currencyRate 存储订单。此外,我们将以客户的货币向他们的信用卡收取费用,以确保他们收到的账单与订单屏幕上显示的完全相同。

现在我遇到的问题是在购物车中以及结帐期间显示购物车总数时。例如,应用程序向模板发送要在购物车中显示的价格:

小计:9.75
船舶:5.95
总计:15.70

模板采用这些金额并在每个项目上调用 priceDisplay 函数。如果货币汇率是 1.1,那么我们会向用户显示:

小计:10.725 -> 10.73
船舶:6.545 -> 6.55
总计:17.27

可以看到小计 + 船 = 17.28,但总换算为 17.27。

所以我认为有几个选项可以工作,虽然没有完全考虑到:

  1. 在应用程序端处理所有转换
  2. 在对项目进行合计的地方,模板应将基础货币中的所有单个加数和总计一起发送到 priceDisplay 函数,该函数将转换它们并确保转换后的总计和加数之和匹配。在这种情况下,我如何向应用程序传达总数不是 15.70 而可能是 15.71 或 15.69(因为我们将以基础货币存储订单并在处理付款时乘以 exchangeRate。)
  3. 作为转换的一部分,跟踪删除/添加的小数点,并用它做一些“聪明”的事情。所以在这个例子中,10.725,我们加了千分之五。所以当我们转换 6.545 时,我们应该先去掉 .005 然后再转换。也许这就是上面选项 2 所做的过程?
  4. 你的建议在这里。

如果有任何区别,应用程序是 PHP 和模板是 Smarty。

您还可以在添加购物车项目的总行数时看到相同的问题:
3 件 x 9.75 每个 = 29.25已
转换:
3 件 x 10.73 (10.725) = 32.18 (32.175)
但 3 x 10.73 = 32.19 != 32.18

4

4 回答 4

6

我坚定地在1阵营。货币转换是核心业务逻辑,属于您的模型,而不是您的视图。

此外,虽然钱看起来像浮点数,但它不是。无论你的基本单位是什么,货币都会以整数形式易手。例如,在美国,如果口香糖每个 10 美分,我买了 10 个,那么我用 100 美分换 10 个口香糖。即使我给一张一美元的钞票,从软件的角度来看,最好把它算作 100 美分。

有关这方面的更多信息,请参阅 Martin Fowler 的“企业应用程序架构模式”“分析模式”。他详细讨论了所有问题并提供了很好的示例代码。您还可以在网上找到其中的一些信息:

  • 数量(带一些钱示例代码)
  • (主要是指向他的书的指针)

如果你需要会计工作,我也会和会计谈谈。货币兑换通常会因改变汇率、奇怪的费用和其他废话而变得复杂,如果您从一开始就没有做好,您可能会花很长时间追逐便士来保持账面平衡。

于 2009-07-17T17:47:10.023 回答
1

如果您基于转换后的货币计费,那么您真的不应该在视图逻辑中进行该计算。

于 2009-07-17T17:39:50.460 回答
0

好吧,就我个人而言,我只会计算总金额,将小计添加到船舶金额中。这显然是最简单的使用方法,没有人会错过额外的一分钱。

于 2009-07-17T17:32:21.943 回答
0

永远不要使用浮点数来赚钱!你无缘无故地让自己进入一个充满伤害的世界。由于 PHP 没有十进制定点类型,所以所有的货币计算都使用整数。请参阅威廉的链接。

于 2009-07-17T17:57:07.913 回答