CakePHP: Как отформатировать недесятичные валюты с символом ПОСЛЕ значения? - PullRequest
3 голосов
/ 30 октября 2011

Я пытаюсь отформатировать французские канадские валюты в моем многоязычном приложении. Я использую расширенную версию NumberHelper, где я использовал addFormat, чтобы добавить формат для французского канадского, но проблема в том, что я не могу найти способ сказать CakePHP, чтобы переместить знак доллара, чтобы появилось после сумма.

Например, $ 3,57 для французского канадца должно отображаться как 3,57 $.

Если я установлю для свойства after значение «$», тогда, когда значение будет равно только центам, оно будет выглядеть как доллары, так что $ 0,57 становится 57 $, что похоже на 57 долларов.

Я попытался установить языковой стандарт с помощью команд PHP setlocale и money_format, но он испортил мои вызовы MySQL, потому что мне пришлось преобразовать все значения валют обратно в английский для всех моих операций CRUD, чего я не делаю есть время на данный момент.

Любые идеи о том, как я мог бы заставить это работать в CakePHP в ремонтопригодном виде?

Заранее спасибо всем опытным, большим мозгам.

-Josh

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

В итоге я расширил класс 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 голосов
/ 24 марта 2014

У меня есть метод _setLanguage () в моем AppController, который я вызываю в обратном вызове 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 или выше.

...