0

所以我正在处理一些要使用用户首选货币格式格式化的数字,但遇到了一个巨大的 wtf 并想看看其他 symfonians 是如何处理这个问题的。

使用NumberFormatter助手有一个format_currency我可以调用的函数,如下所示:

function format_currency($amount, $currency = null, $culture = null)
{
  if (null === $amount)
  {
    return null;
  }

  $numberFormat = new sfNumberFormat(_current_language($culture));

  return $numberFormat->format($amount, 'c', $currency);
}

的签名sfNumberFormat::format看起来像:

function format($number, $pattern = 'd', $currency = 'USD', $charset = 'UTF-8')

看到问题了吗?format_currency如果没有传递货币值,则签名允许默认的空货币值,然后覆盖签名的默认货币值sfNumberFormat::format

我的目标是设置一次用户的首选货币,并且只需将数字传递给format_currency函数,因为传递 X 次调用的货币值是 0 意义。

我在想的是添加一个新的用户属性,它将存储用户的首选货币,然后将 NumberFormat 代码复制到我自己的 lib/helper 中,并引用要传递给sfNumberFormat::format调用的用户属性。

任何 symfonian 以另一种方式解决这个问题?

4

2 回答 2

0

您可以将货币传递给助手的每次调用的原因是,您可以为一个用户使用多种货币,而不管他/她的文化设置如何。

我也没有看到将货币传递给每个助手调用的问题。

事实上,如果您创建一个依赖于会话属性的助手,您将在用户对象和助手之间建立强耦合,我认为这是不对的。您打算如何检索助手内部的属性?您将不得不调用sfContext::get(通常应该避免)或将用户对象传递给助手(这与传递属性完全相同,甚至更糟;))。

于 2013-06-11T07:14:08.503 回答
0

所以我最终只是将源 NumberHelper 函数复制并粘贴到我自己的 lib/helper/NumberHelper.php 中,并更改了currency_helper这样的签名:

// Before
function format_currency($amount, $currency = null, $culture = null)

// After
function format_currency($amount, $currency = 'USD', $culture = null)

这允许 $currency 以sfNumberFormat::format相同的值 (usd) 传递,而不是传递 null。

于 2013-06-13T00:37:18.667 回答