在本地化货币环境中存储电子商务产品信息(即产品价格,当前价格)的最佳策略是什么?
关于使用本地化,分隔符,精确数字等显示货币,我遇到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存储并且值从模型返回到视图,则本地化将修改该值为2,99。
我不愿意在他们不知情的情况下标准化用户输入。标准化货币值是否正常,或者模型是否应该更改以处理多种货币格式?
需要注意的另一个问题是,尽管Spree引擎可以改变本地化,但我认为它还不能满足用户需求。所以从技术上来说,这不是一个“多种货币”的环境,我相信吗?我想选择一个可以扩展的选择。
相关问题:
答案 0 :(得分:3)
问题是你有一种产品,以不同的文化交换制度。比如说它在美国是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。
注意:
无论你做什么,都不要把它存放在漂浮物中,否则随着时间的推移你会得到微妙的错误。使用小数类型
对于作为计算结果的字段,请考虑在小数位后使用4位数