2 Stimmen

NumberFormatter Währungssymbol (voranstellen)

Ich benutze die Intl-Bibliothek, um Zahlen mit Währungssymbol zu formatieren.

$number = new NumberFormatter('es_ES', NumberFormatter::CURRENCY);
echo $number->format('234234.234324');

Meine lokale PHP-Version:

version 1.1.0
ICU version 50.1.2
ICU Data version    50.1

Server:

version 1.1.0
ICU version 50.1.2

Ergebnisse:
Meine Version: 234.234,23 €
Server-Version: € 234.234,23

Das Währungssymbol sollte am Ende der Zahl stehen, anstatt am Anfang der Zahl.

Danke

1voto

enekochan Punkte 11

Ich hatte genau das gleiche Problem mit der intl Erweiterung, die von Plesk mit PHP 7.1 installiert wurde.

$ /opt/plesk/php/7.1/bin/php -a
Interactive shell

php > $a = new \NumberFormatter("es_ES", \NumberFormatter::CURRENCY);
php > echo $a->format(12345.12345);
€ 12.345,12

Dies waren die Versionen von ICU, die es verwendet hat, wie mit /opt/plesk/php/7.1/bin/php -i gesehen:

version  => 1.1.0
ICU version  => 4.2.1

Um es zu lösen, musste ich eine neuere Version von ICU aus den Quellen kompilieren (die neueste Version, die ich ohne Fehler kompilieren konnte, war 58.2) und dann auch die intl Erweiterung für meine PHP-Version mit diesem ICU aus den Quellen kompilieren (da ich Plesk verwende, sind die Binärdateien von PHP diejenigen, die von Plesk verwendet werden):

wget http://download.icu-project.org/files/icu4c/58.2/icu4c-58_2-src.tgz
tar xzvf icu4c-58_2-src.tgz
cd icu/source/
CXXFLAGS="-std=c++0x" ./runConfigureICU Linux --prefix=/opt/icu4c-58_2
make
sudo make install

cd ../../

wget http://php.net/distributions/php-7.1.22.tar.gz
tar xzvf php-7.1.22.tar.gz
cd php-7.1.22/ext/intl
/opt/plesk/php/7.1/bin/phpize
./configure --with-php-config=/opt/plesk/php/7.1/bin/php-config --enable-intl --with-icu-dir=/opt/icu4c-58_2
make
sudo make install

Dann stellen Sie sicher, dass die Erweiterung geladen ist, in meinem Fall in /opt/plesk/php/7.1/etc/php.d/intl.ini:

; Enable intl extension module
extension=intl.so

Dann starten Sie httpd, Apache, PHP-FPM oder was auch immer PHP lädt, neu oder laden Sie es neu:

sudo service httpd restart

Die Versionen, die von /opt/plesk/php/7.1/bin/php -i angezeigt werden:

version => 1.1.0
ICU version => 58.2
ICU Data version => 58.2

Jetzt wird die Währung korrekt angezeigt:

$ /opt/plesk/php/7.1/bin/php -a
Interactive shell

php > $a = new \NumberFormatter("es_ES", \NumberFormatter::CURRENCY);
php > echo $a->format(12345.12345);
12.345,12 €

0voto

Oyeme Punkte 10820

Ich habe es als Helfer erstellt.

/**
 * Number format wrapper
 */
class NumberFormat extends Helper\NumberFormat {
    private $serviceLocator;

    public function setServiceLocator($service) {
        $this->serviceLocator = $service;
    }
    /**
     * Number format
     * @param type $number
     * @param type $decimals
     * @param type $formatStyle
     * @param string $currency
     * @param type $locale
     * @return string
     */
    public function __invoke(
        $number,
        $decimals    = null,
        $formatStyle = null,
        $currency  = null,
        $locale      = null
    ) {

        $currency = strtoupper($currency);
        //get current locale
        $currentLocale = $this->serviceLocator->get('translator')->getLocale();
        $config  =  $this->serviceLocator->get('config');

        //mapping between countries
        if(isset($config['application-options']['currency-symbol-map'][$currentLocale])) {
            $currenciesMapping = $config['application-options']['currency-symbol-map'];
            $localeCurrency = $currenciesMapping[$currentLocale];
            //England pound != euro
            if(strtolower($currency) != $localeCurrency) {
                $locale = array_search($currency,$currenciesMapping);
            }
        };

        if (!$locale) {
            $locale = $currentLocale;
        }
        if (null === $formatStyle) {
            $formatStyle = $this->getFormatStyle();
        }

        if (!is_int($decimals) || $decimals < 0) {
            $decimals = $this->getDecimals();
        }
        // 6.000000 should be 6.00 and decimals more than 2
        $numberExplode = explode('.',$number);

        if($decimals > 2 && $numberExplode[1] == 0) {
            $decimals = 2;
        }

        $formatType = $this->getFormatType();

        $formatterId = md5($formatStyle . "\0" . $locale . "\0" . $decimals);

        if (!isset($this->formatters[$formatterId])) {
            $this->formatters[$formatterId] = new NumberFormatter(
                $locale,
                $formatStyle
            );

            if ($decimals !== null) {
                $this->formatters[$formatterId]->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $decimals);
                $this->formatters[$formatterId]->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimals);
            }
        }

        //modify pattern
        //always at the begining
        if($formatStyle == \NumberFormatter::CURRENCY) {
            $pattern = str_replace('¤','',$this->formatters[$formatterId]->getPattern());
            $this->formatters[$formatterId]->setPattern('¤'.$pattern);
        }
        if($currency == null)
            return  $this->formatters[$formatterId]->format($number, $formatType);
        else
            return $this->formatters[$formatterId]->formatCurrency($number,$currency);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X