数据库、货币建模、本地化策略

Dom*_*edi 5 database currency ruby-on-rails e-commerce spree

在本地化货币环境中存储电子商务产品信息(即产品价格、当前价格)的最佳策略是什么?

在 Spree(Ruby on Rails 的电子商务引擎)中遇到了一个关于使用本地化、分隔符、精确数字等显示货币的问题。

然而,解决价格的显示变得更加复杂,当我们必须弄清楚在数据库中存储的值是否应该包括本地化分隔符/精度数字或规范化。该解决方案涉及本地化值的显示以及可能对数据库中存储的值进行规范化。但我不确定这是否是标准做法(清理数据以适应“标准”精度和分隔符或修改模型以接收“货币”字段,并保持输入标准。

案例分析:

如果来自美国的产品(使用“en”本地化文件)定价为 2.99,则它在数据库中存储为 2.99。如果站点更新为针对德国进行本地化(使用“de”本地化文件),则其价格为 2.99。但是,该价格(和 cost_price)值的更新应该存储为 2.99 还是 2,99?如果它们存储在 2.99 并且值从模型返回到视图,则本地化会将值修改为 2,99。

我不愿在他们不知情的情况下标准化用户输入。标准化货币值是否正常,还是应该更改模型以处理多货币格式?

需要注意的额外问题是,即使 Spree 引擎可以更改本地化,我也不相信它可以根据用户需求进行翻转。所以从技术上讲,这不是“多货币”环境,我相信吗?我想选择一个可以扩展的选择。

相关问题:

  1. 数据库设计:多币种账户
  2. 数据库中的货币建模

Nei*_*gan 3

问题是你有一种产品,在具有不同文化的不同交换体系中销售。假设美国的价格为 1,450.00 美元,德国的价格为 1111,11 欧元。主要有两个因素:

A. 不同货币有不同的价格
B. 不同文化中显示金额的方式不同

关于A,你可以

  • 以一种价格/货币存储,并即时调整为不同的汇率
  • 或每晚调整
  • 或者只是不同国家的价格不同

我会使用按货币分隔的价格表。每晚更新可能是合理的:

ProductId  Currency  Price
1          EUR       1111.11
1          CAD       1436.65
1          USD       1450.00
Run Code Online (Sandbox Code Playgroud)

这些值应该是数字,以便您可以在必要时轻松地对它们进行数学运算。在数据库中使用十进制(10,2)

关于B

您应该在显示时将所选价格格式化为给定的区域性。想象一下一个美国人用欧元付款。他们想看到什么?您的输出将如下所示,具体取决于所选的区域性:

假设是 1,111.11 欧元

Culture  Price    Long Name
de_de   1.111,11  (German)
fr_ca   1 111,11  (Quebec)
en_us   1,111.11  (US English)
Run Code Online (Sandbox Code Playgroud)

数量都是相同的,只是格式不同,具体取决于用户的偏好。

如果用户输入不同的数量,您还必须根据所选的文化来解析他们的值。查看 Yii 的(对不起,PHP)L10N 和 I18N功能

笔记:

无论你做什么,都不要将其存储为浮点数,否则随着时间的推移你会遇到细微的错误。使用小数类型

考虑在计算结果字段中使用小数点后 4 位数字