2011-10-30 45 views
3

我想在我的多语言应用程序中格式化法语加拿大货币。我使用的是NumberHelper的扩展版本,我使用addFormat为法语加拿大添加了格式,但问题是我无法找到一种方法告诉CakePHP将之后的美元符号出现在之后量。CakePHP:如何在符号后格式化非十进制货币?

例如,$ 3.57应显示为法语加拿大人的3,57 $。

如果我将after属性设置为“$”,那么当某个值仅为美分时,它看起来像美元,因此0.57美元变成57美元,看起来像57美元。

我尝试设置使用PHP setlocalemoney_format命令的语言环境,但它搞砸了我的MySQL调用,因为我有所有的货币值转换回英文为我所有的CRUD操作,我没有时间在这一刻。

关于如何在CakePHP中以可维护的方式获得此操作的任何想法?

在此感谢所有经验丰富的大脑。

-Josh

回答

1

最后,我延长NumberHelper类和简单地加入我的需要货币在__construct()方法。然后,我建立了另一种名为money的方法,如果我的语言设置是法语加拿大语言,就会强制转换任何金额,以确保数千个空格不间断,并在数量后添加间隔美元符号(完整代码下面)。

我对此并不满意,但它完成了工作。如果任何人都可以建议如何在PHP中设置用户的语言环境而不改变数据库插入,我会很感兴趣。

class CurrencyHelper extends NumberHelper { 

var $helpers = array('Session'); 

function __construct() { 
    parent::__construct(); 

    $this->addFormat('en_ca', array(
     'before' => '$', 
     'after' => false, 
     'zero' => 0, 
     'places' => 2, 
     'thousands' => ',', 
     'decimals' => '.', 
     'negative' => '()',)); 

    $this->addFormat('fr_ca', array(
     'before' => false, 
     'after' => false, 
     'zero' => 0, 
     'places' => 2, 
     'thousands' => ' ', 
     'decimals' => ',', 
     'negative' => '()',)); 
} 

function money($amount = 0, $useLocale = true) { 
    $locale = 'en_ca'; 
    if ($useLocale) { 
     $s = new CakeSession(); 
     $locale = $s->read('Config.language'); 
     unset($s); 
    } 

    $result = str_replace(' ', ' ', $this->currency($amount, $locale)) . ($locale == 'fr_ca' ? ' $' : ''); 
    return $result; 
} 

} 
0

我在我的AppController中有一个_setLanguage()方法,我在beforeFilter()回调中调用以设置语言。我添加了这个代码来配置法语加拿大货币

if($this->Session->read('Config.language') == 'fra') { 
    CakeNumber::addFormat('fr_CA', array(
     'wholeSymbol' => '$', 
     'wholePosition' => 'after', 
     'thousands' => ' ', 
     'decimals' => ',', 
     'negative' => '()',)); 
    CakeNumber::defaultCurrency('fr_CA'); 
} 

这应该在CakePHP 2.3或更高版本中工作。