2009-01-12 11 views
16

मैं अपनी वेबसाइट आगंतुकों के लिए संख्या 3253454 प्रारूपित करना चाहता हूं।PHP: लोकेल जागरूक संख्या प्रारूप

अगर मैं इनबिल्ट number_format फ़ंक्शन का उपयोग करें, मैं मिलता है: 3,253,454 जो ब्रिटेन और अमेरिका के लिए अच्छा है, फिर भी अधिकांश अन्य देशों 3.253.454

का उपयोग मैं कई अंतरराष्ट्रीय आगंतुकों की है।

क्या कोई मुझे यहां सर्वोत्तम अभ्यास के लिए सूचक दे ​​सकता है?

आदर्श रूप से मैं ब्राउज़र का लोकेल प्राप्त करना चाहता हूं और तदनुसार संख्या को प्रारूपित करना चाहता हूं। क्या यह PHP में भी संभव है?

उत्तर

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

php doku for number_format

देख एक अन्य उपयोगी लिंक Zend फ्रेमवर्क से Zend_Locale हो सकता है - यह अपने उपयोगकर्ताओं की भाषा का पता लगाने और भी नंबर/मुद्रा स्वरूपण

4

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; 
     } 
    } 

?> 

ऐसा लगता है कि आप वास्तव में क्या देख रहे हैं। :)

0

आप अपने स्थान और उम्मीद संख्या स्वरूप का अनुमान लगाना HTTP_ACCEPT_LANGUAGE सर्वर चर का उपयोग कर सकते हैं। आप एक स्थानीय वेबसाइट की तैनाती कर रहे हैं,

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 = ' '; 
      break; 
     case 'es': 
     case 'es-mx': 
     default: 
      $decimal = ','; 
      $thousands = ' '; 
    } 
    return $number_format($number,$decimals,$decimal,$thousands); 
} 
+1

कृपया ध्यान दें कि मैं नहीं पता है (और न ही शोध किया है) के ऊपर स्थान की उम्मीद प्रारूपों। – yaauie

+0

हम $ दशमलव = '।' का उपयोग करते हैं और $ हजार = ',' यहां 'धूप' blighty (en-gb) :) – Christian

14

:

यदि मैं यह लागू करने के लिए थे, मैं एक उपयोगकर्ता अनुमान लगाया ओवरराइड करने के लिए एक प्राथमिकता निर्धारित करने की अनुमति चाहते हैं, और मेरे समारोह इस प्रकार दिखाई देगा आप यह सुनिश्चित करना चाहते हैं कि आप setlocale() देखें। yaauie के ऊपर पोस्ट के बंद रिफ करने के लिए मैं अपने प्रवर्तन कोड में निम्न कोड स्निपेट की तरह कुछ जोड़ेंगे:

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

फिर हम इतने तरह देखने के लिए ऊपर समारोह number_format_locale() संशोधित करने,:

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

एक आदर्श दुनिया में है, जिस प्लेटफॉर्म पर आप तैनात हैं, और आपके द्वारा इंस्टॉल की गई लोकेल फाइलों का कौन सा संस्करण है, आपको कुछ अनियमितताओं के आसपास कोड करना पड़ सकता है। लेकिन लोकेल सेटिंग पैसे, संख्याओं और तिथियों के साथ मदद करने जा रही है।

+0

प्रतिभा। मेरे लिए एक जादू की तरह काम किया। –

+0

सावधान रहें कि setlocale() थ्रेड-सुरक्षित नहीं है। इसका अर्थ यह है कि यदि आप किसी सर्वर पर PHP चला रहे हैं जो प्रक्रियाओं (या किसी दिन की योजना) के बजाय थ्रेड का उपयोग करता है, तो लोकेल को बदलने के लिए setlocale() का उपयोग न करें। नंबरफॉर्मेटर का सुझाव देने वाला नया उत्तर देखें, जो अब ऐसा करने का पसंदीदा तरीका है। – orrd

0

अपने प्रोजेक्ट में मैं Zend फ्रेमवर्क का उपयोग करें। इस मामले में मैं ऐसी चीज का उपयोग करता हूं:

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

// will return 2,5 
print $number; 
6

शायद सभी स्क्रिप्ट के लिए वैश्विक लोकेल सेट करने से स्वतंत्र दृष्टिकोण का प्रयास करें?

प्राप्त उपयोगकर्ता किसी भी स्थान:

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

स्वरूप संख्या:

मैं PHP NumberFormatter उपयोग करना चाहिये।यह एक ओओपी दृष्टिकोण है जो ICU library का उपयोग करता है। दशमलव, मुद्रा या प्रतिशत:

$formatStyle=NumberFormatter::DECIMAL; 
$formatter= new NumberFormatter($locale, $formatStyle); 
echo $formatter->format(3253454);//proper output depending on locale 

आप कई अलग शैली वहाँ उदाहरण के लिए प्रारूपों का उपयोग कर सकते हैं। here और पढ़ें।

यह संख्या स्वरूपण का सबसे अच्छा तरीका है, क्योंकि यह वैश्विक Unicode Common Locale Data Repository पर निर्भर करता है।

संबंधित मुद्दे