在本地化货币环境中存储电子商务产品信息(即产品价格、当前价格)的最佳策略是什么?
我遇到了一个 issue in Spree, an e-commerce engine for Ruby on Rails关于使用本地化、分隔符、精度数字等显示货币。
然而,resolving the display of price became more complex,当我们必须确定数据库中的值存储是否应包括本地化分隔符/精度数字或被规范化时。该解决方案涉及本地化值的显示以及可能规范化数据库中存储的值。但我不确定这是否是标准做法(清理数据以适应“标准”精度和定界符,或者修改模型以接受“货币”字段,并保持输入标准。
案例研究:
如果来自美国的产品(使用“en”本地化文件)定价为 2.99,则它在数据库中存储为 2.99。 如果站点更新为德国本地化(使用“de”本地化文件),那么它的价格为 2,99。 但是,该价格(和 cost_price)值的更新应该存储为 2.99 还是 2,99?如果它们存储在 2.99 并且值从模型返回到 View ,则本地化会将值修改为 2,99。
我对在用户不知情的情况下对用户输入进行标准化犹豫不决。标准化货币值是正常的,还是应该更改模型以处理多货币格式?
另一个需要注意的问题是,尽管 Spree 引擎可以更改本地化,但我认为它还不能根据用户需求进行翻转。所以我相信这在技术上不是一个“多货币”环境?我想选择一个可以扩展的选项。
相关问题:
最佳答案
问题是您有一种产品,在具有不同文化的不同交换制度下销售。假设在美国是 1,450.00 美元,在德国是 1111,11 欧元。有两个主要因素:
一个。不同货币有不同价格
B. 不同的文化有不同的金额表示方式
关于A,你可以
- 以一种价格/货币存储,并即时调整以适应不同的汇率
- 或每晚调整
- 或者只是在不同的国家有不同的价格
我会使用按货币分隔的价格表。每晚更新可能是合理的:
ProductId Currency Price
1 EUR 1111.11
1 CAD 1436.65
1 USD 1450.00
这些值应该是数字,以便您可以在必要时轻松地对它们进行数学运算。在你的数据库中使用 decimal(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)
都是一样的数量,只是格式不同,取决于用户的喜好。
如果用户输入的数量不同,您还必须根据所选的区域性解析他们的值。查看 Yii 的(抱歉,PHP)L10N 和 I18N features .
注意事项:
无论您做什么,都不要将其存储为 float ,否则随着时间的推移您会出现细微的错误。使用小数类型
考虑在作为计算结果的字段中使用小数点后 4 位
关于ruby-on-rails - 数据库、货币建模、本地化策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651388/