PHP: Yerel farkında sayı biçimi

7 Cevap php

Benim web sitesi ziyaretçileri için numara 3253454 biçimlendirmek istiyorum.

Ben dahili number_format işlevini kullanırsanız, ben alıyorum: İngiltere ve ABD için büyük 3.253.454, ancak çoğu diğer ülkelerde 3.253.454 kullanın

Ben birçok uluslararası ziyaretçi var.

Herkes bana burada iyi uygulama için bir işaretçi verebilir misiniz?

İdeal tarayıcının yerel almak ve buna göre numarasını biçimlendirmek istiyoruz. Bu PHP bile mümkün mü?

7 Cevap

Eğer yerelleştirilmiş bir web sitesi dağıtımı ediyorsanız, yapmak istediğiniz için gidiyoruz emin setlocale(). Ben senin başlatma kodu aşağıdaki kod parçacığını gibi bir şey eklemek istiyorum yaauie en yukarıda yazılan kapalı riff:

$locale = ( isset($_COOKIE['locale']) ? 
            $_COOKIE['locale'] : 
            $_SERVER['HTTP_ACCEPT_LANGUAGE'];
setlocale($locale);

Sonra biz çok benzemesi için, yukarıdaki işlevi number_format_locale() değiştirin:

function number_format_locale($number,$decimals=2) {
    $locale = localeconv();
    return number_format($number,$decimals,
               $locale['decimal_point'],
               $locale['thousands_sep']);
 }

Tabii ki size dağıtmak platforma bağlı olarak, ideal bir dünyada, ve yüklediğiniz yerel dosyaları hangi sürümü, bazı usulsüzlük etrafında kod olabilir. Ama ayar yerel para, sayı ve tarih ile yardımcı oluyor.

string number_format (float $number, int $decimals, string $dec_point, string $thousands_sep)

bkz php doku for number_format

Başka bir yararlı link Zend_Locale Zend Framework arası olabilir - bu, kullanıcının dilini algılar ve aynı zamanda sayı / para birimi biçimlendirme yardımcı olabilir

Dan http://us3.php.net/manual/en/function.number-format.php#76448:

<?php

    function strtonumber( $str, $dec_point=null, $thousands_sep=null )
    {
        if( is_null($dec_point) || is_null($thousands_sep) ) {
            $locale = localeconv();
            if( is_null($dec_point) ) {
                $dec_point = $locale['decimal_point'];
            }
            if( is_null($thousands_sep) ) {
                $thousands_sep = $locale['thousands_sep'];
            }
        }
        $number = (float) str_replace($dec_point, '.', str_replace($thousands_sep, '', $str));
        if( $number == (int) $number ) {
            return (int) $number;
        } else {
            return $number;
        }
    }

?>

İşte aradığınız tam olarak ne gibi görünüyor. :)

Küreselleşme gerçekten zor korkutuyor çünkü bu soruya kolay bir cevap var,. Tarzı varyasyonları bir ton ayırıcı gider binlerce ayırıcı ve nerede dahil olmak üzere, var (ipucu: her zaman binlerce değil). Ayrıca negatif bazen parantez onları yerleştirerek ve bazen numarasından sonra negatif yerleştirerek, çok farklı ülkeden ülkeye işlenir.

Yani benim tavsiyem, söyledi. Küreselleşme unut. Aslında birden fazla yerel ayarlar desteklemek için gidiyoruz değil, tam olarak sadece iyi bildiğiniz bir yerelinde sopa. İnsanlar genellikle kendileri bunu daha farklı format numaralarını görmek için (özellikle uluslararası millet) alışıktır.

Hala bunu yapmak için kararlı iseniz Şimdi, ben orada daha iyi küreselleşme kütüphanelerinden birine yararlanarak öneririz. Bu, muhtemelen uzmanları sizin için halletsin isteyen yerlerden biridir.

Onların yerel ve beklenen sayı biçimini tahmin etmek HTTP_ACCEPT_LANGUAGE sunucu değişkeni kullanabilirsiniz.

Ben bunu uygulamak için olsaydı, ben bir kullanıcı tahmin geçersiz kılmak için bir tercih ayarlamak için izin istiyorum, ve benim işlevi aşağıdaki gibi görünecektir:

function number_format_locale($number,$decimals=2) {
    $locale = ( isset($_COOKIE['locale']) ? 
                    $_COOKIE['locale'] : 
                    $_SERVER['HTTP_ACCEPT_LANGUAGE']
               )
    switch($locale) {
        case 'en-us':
        case 'en-ca':
            $decimal = '.';
            $thousands = ',';
            break;
        case 'fr':
        case 'ca':
        case 'de':
        case 'en-gb':
            $decimal = ',';
            $thousands = ' ';
        case 'es':
        case 'es-mx':
        default:
            $decimal = ',';
            $thousands = ' ';
    }
    return $number_format($number,$decimals,$decimal,$thousands);
}

Bu aslında oldukça karmaşıktır. Bu sınıf, bunu çok iyi işler: http://www.webreference.com/programming/Globalize-Web-Applications03/

Projemde ben Zend Framework kullanmak. Bu durumda ben böyle bir şey kullanın:

$locale = new Zend_Locale('fr_FR');
$number = Zend_Locale_Format::toNumber(2.5, array('locale' => $locale));

// will return 2,5
print $number;