2012-12-16 32 views
33
में मुद्रा प्रतीक जाओ

के NumberFormatter के साथ पैसे फ़ॉर्मेट करने के लिए कोड के सरल टुकड़ा साथ शुरू करते हैं:पीएचपी

$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY); 
echo $formatter->formatCurrency(123456789, 'JPY'); 

यह प्रिंट: ¥123,456,789

यह ठीक है अगर आप पैसे प्रारूपित करना चाहते हैं।

लेकिन मैं जो करना चाहता हूं वह मुद्रा मुद्रा आईएसओ 4217 कोड (जैसे जेपीवाय) के लिए मुद्रा प्रतीक (उदा। ¥) प्राप्त करना है।

मेरा पहला अनुमान का उपयोग कर प्रयास करने के लिए किया गया था:

$formatter->getSymbol(NumberFormatter::CURRENCY_SYMBOL); 

लेकिन वह (en_US) निर्माता में दिए गए स्थान के लिए मुद्रा प्रतीक, मेरे मामले में $ देता है।

क्या PHP में मुद्रा आईएसओ 4217 कोड द्वारा मुद्रा प्रतीक प्राप्त करने का कोई तरीका है?

+0

समस्या यह है कि मुद्रा प्रतीक संख्या के पहले या बाद में दिखाई दे सकता है। आप किस प्रतीक का उपयोग कर रहे हैं? –

+4

बस किसी भी चीज के लिए रेगेक्स करें जो अंक या अल्पविराम नहीं है। कुछ '/ [^ 0-9,] */'की तरह कुछ। – rmobis

+0

कुछ प्रतीकों बहु-बाइट होंगे इसलिए एक साधारण स्ट्रिंग खोज बहुत अच्छी तरह से काम नहीं करेगी। –

उत्तर

9

मैं इस का उपयोग कर https://github.com/symfony/Intl हासिल की:

Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR') 

रिटर्न

'€'. 
+2

तकनीकी रूप से (आईएमएचओ) यह वास्तव में प्रश्न का उत्तर नहीं देता है, जो कि PHP के बारे में था, सिम्फनी नहीं। – geoidesic

+3

@geoidesic मैंने इस सवाल से पूछा, और लक्ष्य PHP में मुद्रा प्रतीक प्राप्त करना है। तीसरे पक्ष के पुस्तकालयों का उपयोग करने की अनुमति है और प्रोत्साहित किया जाता है। – umpirsky

+0

इसके अलावा, क्या एक सुंदर वाक्यविन्यास। –

3

चूंकि प्रतीकों बहु-बाइट हो सकते हैं, इसलिए मैंने सभी गैर-विराम चिह्न और गैर-अंकों वाले वर्णों को सही ढंग से पकड़ने के लिए एमबी _ *() फ़ंक्शंस का उपयोग किया जो केवल प्रतीक को छोड़ देगा।

function get_currency_symbol($string) 
{ 
    $symbol = ''; 
    $length = mb_strlen($string, 'utf-8'); 
    for ($i = 0; $i < $length; $i++) 
    { 
     $char = mb_substr($string, $i, 1, 'utf-8'); 
     if (!ctype_digit($char) && !ctype_punct($char)) 
      $symbol .= $char; 
    } 
    return $symbol; 
} 

$format = new NumberFormatter('en_US', NumberFormatter::CURRENCY); 
$string = $format->formatCurrency(123456789, 'JPY'); 
echo get_currency_symbol($string); 
+0

मुद्रा प्रतीकों एक से अधिक वर्ण हो सकते हैं, उदाहरण के लिए, एस्टोनिया क्रून = "केआर"। – Niko

+0

@ निको 2 अधिकतम अधिकतम है? –

+0

[आईएसओ 4217] (http://en.wikipedia.org/wiki/ISO_4217) तीन अक्षरों को निर्दिष्ट करता है। – Charles

-1

इस प्रकार का प्रयास करें:

$formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL); 
+1

नहीं, आईएसओ कोड देता है। – umpirsky

0

गुप्त एक अच्छा जवाब है, लेकिन वहाँ एक सरल है w ay यह करने के लिए:

preg_replace('#[a-z0-9.]*#i', '', $formatter->formatCurrency('0', $currency)) 

यह एक अच्छा सरल इनलाइन समाधान एक और समारोह की घोषणा की आवश्यकता नहीं है कि है, लेकिन यह भी ठीक से सभी मामलों को संभाल नहीं करता है - अर्थात मुद्राओं जहां पत्र उत्पादन का हिस्सा हैं। लेकिन उदाहरण के बीच अंतर करने के लिए $ और £, यह ठीक काम करता है।

27

सबसे पहले, कोई वैश्विक वैश्विक मुद्रा प्रतीक तालिका नहीं है, कि ग्रह पर कोई भी पढ़ और समझ सकता है।

प्रत्येक क्षेत्र/देश में मुद्रा प्रतीकों में भिन्नता होगी, यही कारण है कि आपको ब्राउजर/उपयोगकर्ता लोकेल का उपयोग करके पढ़ने के आधार पर उन्हें निर्धारित करना होगा।

सही तरीके के रूप में आप अनुमान लगाया, NumberFormatter :: CURRENCY_SYMBOL का उपयोग कर, लेकिन आप पहले en-अमेरिकी मुद्रा @ तरह उचित स्थान सेट करने के लिए = JPY है:

$locale='en-US'; //browser or user locale 
$currency='JPY'; 
$fmt = new NumberFormatter($locale."@currency=$currency", NumberFormatter::CURRENCY); 
$symbol = $fmt->getSymbol(NumberFormatter::CURRENCY_SYMBOL); 
header("Content-Type: text/html; charset=UTF-8;"); 
echo $symbol; 

इस तरह प्रतीक होगा उपयोगकर्ता द्वारा समझ में आओ।

उदाहरण के लिए, $ प्रतीक होगा:

  • कैनेडियन डॉलर (सीएडी): सीए संयुक्त राज्य अमेरिका में $, रोमानिया में सीएडी, $ सीए ईरान
  • ईरान में रियाल (आईआरआर): आईआरआर यूएसए में, जबकि ईरान में
+0

उत्कृष्ट !! +1। मेरी इच्छा है कि मुद्रा 'आईएसओ 'के आधार पर' लोकेल 'को पुनः प्राप्त करने का एक तरीका था। कुछ 'rlocaleconv (int_curr_symbol,' जेपीवाय ') की तरह कुछ' या तो! – Fr0zenFyr

0
Zend_Locale::getTranslationList('CurrencySymbol') 

आपको उनके प्रतीक को 3 अक्षर मुद्रा कोडों का एक सहयोगी सरणी देगा।

तो इस तरह उपयोग कर सकते हैं:

$curArr = Zend_Locale::getTranslationList('CurrencySymbol'); 
echo $curArr['GBP']; 
1

आप इस समारोह setlocale("LC_ALL", "es_AR"); का उपयोग कर आप localeconv()['currency_symbol'] या localeconv()['int_curr_symbol'] स्थान मुद्रा प्रतीक और मुद्रा प्रतीक के अंतरराष्ट्रीय भिन्नता प्राप्त करने के लिए उपयोग कर सकते हैं लोकेल सेट करते हैं।

+0

यह क्यों कम हो गया है? – clentfort