【问题标题】:Database, Currency Modeling, Localization strategies数据库、货币建模、本地化策略
【发布时间】:2012-03-27 22:14:47
【问题描述】:

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

我遇到了一个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 引擎可以改变本地化,我认为它还不能根据用户需求翻转。所以我相信这在技术上不是一个“多货币”环境?我想选择一个可以扩展的选项。

相关问题:

  1. database design: accounts with multi currency
  2. Currency modeling in database

【问题讨论】:

    标签: ruby-on-rails database e-commerce currency spree


    【解决方案1】:

    问题在于,您有一种产品,在不同的交易制度下以不同的文化进行销售。假设美国为 1,450.00 美元,德国为 1111,11 欧元。有两个主要因素:

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

    关于A,你可以

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

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

    ProductId  Currency  Price
    1          EUR       1111.11
    1          CAD       1436.65
    1          USD       1450.00
    

    这些值应该是数字,以便您可以在必要时轻松地对它们进行数学运算。在数据库中使用小数(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 位作为计算结果的字段

    【讨论】:

    • 所以应该存储为 2.99 而不是 2,99?并将数字和精度归一化为格式?
    • 您不必担心存储中的格式问题。向用户显示的格式。如果他是德国人,请将其格式化为德国人。如果他是美国人,请为美国人格式化。
    • 我认为这个答案并不是很有帮助。如果德国用户以典型的德国方式输入价格“2,99”,那么任何应用程序如何将其转换为“2.99”的“正确”数字?覆盖模型上的 setter 方法?
    • 我希望社区其他成员提供更多意见。也许我应该重新打开这个问题?我假设他们会使用“规范化”方法将该值与用户的任何“本地化”输入与数据库中的标准值(即使用小数表示精度的数字)进行比较。我研究并发现将数据模型扩展为具有与“价格”相关联的“国家代码”是一种常见的做法。但我不想过多地修改模型,特别是因为该解决方案无助于报告和计算。
    • 谢谢你,尼尔。只是为了澄清一下,您是说您应该扩展模型/数据库以包含常规价格作为数字(即 2.99)以及国家货币 ID(即 USD / DE)和用户输入的货币价值(即2.99、2,99 等)
    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多