2012-11-13 35 views
6

पर आधारित मुद्रा के रूप में दशमलव का प्रारूप मेरे पास राशि, और मुद्रा कोड (यूएसडी, जेपीवाई, सीएडी, यूरो इत्यादि) के साथ शुल्क की एक तालिका है, और मैं मुद्रा को उचित रूप से प्रारूपित करने का सबसे आसान तरीका ढूंढ रहा हूं। मेरे स्थानीय संस्कृति कोड (यूएसए) का उपयोग करके और अपना दशमलव लेना। टोस्टिंग ("सी") मुझे $ 0.00 आउटपुट प्राप्त करता है, लेकिन मुझे कोड के आधार पर सही मुद्रा चिह्न और दशमलव की संख्या चाहिए।मुद्रा कोड

क्या इसके लिए कोई पुस्तकालय मौजूद है? मैं निश्चित रूप से प्रत्येक के लिए एक स्विच स्टेटमेंट और कस्टम नियम लिख सकता हूं, लेकिन सोचा कि यह पहले किया जाना चाहिए था।

अद्यतन:

के रूप में इस प्रकार है

static IDictionary<string, string> GetCurrencyFormatStrings() 
{ 
    var result = new Dictionary<string, string>(); 

    foreach (var ci in CultureInfo.GetCultures(CultureTypes.AllCultures)) 
    { 
     try 
     { 
      var ri = new RegionInfo(ci.Name); 
      result[ri.ISOCurrencySymbol] = 
        string.Format("{0}#,#0.{1};({0}#,#0.{1})", 
           ri.CurrencySymbol, 
           new string('0', 
           i.NumberFormat.CurrencyDecimalDigits)); 
     } 
     catch { } 
    } 

    return result; 
} 

यह मैं बस जाने के लिए Amount.ToString (मुद्रा [ "JPY"]) की अनुमति देता है मैं जॉन बी के नमूना कोड संशोधित कर लिया है, और प्रारूप होगा उत्पादन मेरे स्थानीय संदर्भ में अल्पविराम विभाजक, लेकिन सही मुद्रा प्रतीक और दशमलव स्थानों को स्वचालित रूप से रखें।

मुझे बताएं कि क्या किसी के पास ऐसा करने का क्लीनर तरीका है, या मैं जल्द ही जॉन के जवाब को सही के रूप में चिह्नित करूंगा।

+0

@AakashM - वास्तव में यह मौजूद है। इसे 'संस्कृतिइन्फो' कहा जाता है। –

+0

मेरी पिछली टिप्पणियों को वापस लेते हुए, मुझे लगता है कि ['RegionInfo' किसी क्षेत्र की मुद्रा के लिए मुद्रा कोड जानता है] (http://msdn.microsoft.com/en-us/library/system.globalization.regioninfo.isocurrencysymbol.aspx), इसलिए फ्रेमवर्क में इनके बारे में कुछ ज्ञान है। मुझे संदेह है कि आपको फिर से शुरू करना होगा, क्योंकि मुझे कोई मुद्रा-कोड-आधारित लुकअप नहीं दिख रहा है। – AakashM

+0

@ रामहाउंड 'संस्कृतिइन्फो 'आपको बताता है कि किसी दिए गए संस्कृति में मुद्रा-ईश मात्रा कैसे प्रारूपित करें। यह आपको नहीं बताता है कि जेपीवाई के लिए प्रतीक ¥ है। – AakashM

उत्तर

2

आप एक शब्दकोश का निर्माण कर सकते मुद्रा प्रतीक के लिए आईएसओ मुद्रा प्रतीक (USD) से जाने के लिए ($):

static void Main(string[] args) 
{ 
    var symbols = GetCurrencySymbols(); 

    Console.WriteLine("{0}{1:0.00}", symbols["USD"], 1.5M); 
    Console.WriteLine("{0}{1:0.00}", symbols["JPY"], 1.5M); 

    Console.ReadLine(); 
} 

static IDictionary<string, string> GetCurrencySymbols() 
{ 
    var result = new Dictionary<string, string>(); 

    foreach (var ci in CultureInfo.GetCultures(CultureTypes.AllCultures)) 
    { 
     try 
     { 
      var ri = new RegionInfo(ci.Name); 
      result[ri.ISOCurrencySymbol] = ri.CurrencySymbol;      
     } 
     catch { } 
    } 

    return result; 
} 

बुनियादी है कि विचार, आपको अपनी जरूरतों के अनुसार इसे बदलने की आवश्यकता होगी।

ध्यान दें कि आप निश्चित रूप से CultureInfo कक्षा का उपयोग किसी विशिष्ट संस्कृति के लिए स्ट्रिंग में कनवर्ट करने के लिए कर सकते हैं, लेकिन जैसा कि एलेक्सी की टिप्पणी में उल्लेख किया गया है, जिससे प्रत्येक स्ट्रिंग थोड़ा अलग हो जाएगी (जैसे 1.00 बनाम 1,00)। जो भी आप उपयोग करते हैं वह आपकी आवश्यकताओं पर निर्भर करता है।

+0

यह बहुत करीब दिखता है - सभी मुद्राओं में 2 दशमलव स्थान नहीं हैं (येन में सबसे छोटी वृद्धि 1 है), क्या यह क्षेत्र की जानकारी में भी है? – Superman

+1

ci.NumberFormat.CurrencyDecimalDigits का जिक्र करने जैसा लगता है मुझे सब कुछ चाहिए जो मुझे चाहिए - धन्यवाद! – Superman

+0

@ सुपरमैन जानना अच्छा है! –

5

गुजर द्वारा किया जाना चाहिए CultureInfo:

CultureInfo ci = new CultureInfo("en-GB"); 
amount.ToString("C", ci); 
+4

+ 0। मुझे नहीं लगता कि यह @ सुपरमैन परिणाम देगा जो उचित दिखता है आउटपुट का संख्या स्वरूपण भाग मेल नहीं करेगा यदि 2 मुद्रा मान अलग-अलग दशमलव विभाजक का उपयोग कर रहे हैं (यानि यूएसडी और यूरो $ 1.23 और "यूरो" 1,23 की तरह कुछ होंगे - पाठकों के लोकेल के आधार पर संख्याओं में से एक पाठक को 123 की तरह दिखेगा)। –

16
public static class DecimalExtension 
{ 
    private static readonly Dictionary<string, CultureInfo> ISOCurrenciesToACultureMap = 
     CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
      .Select(c => new {c, new RegionInfo(c.LCID).ISOCurrencySymbol}) 
      .GroupBy(x => x.ISOCurrencySymbol) 
      .ToDictionary(g => g.Key, g => g.First().c, StringComparer.OrdinalIgnoreCase); 

    public static string FormatCurrency(this decimal amount, string currencyCode) 
    { 
     CultureInfo culture; 
     if (ISOCurrenciesToACultureMap.TryGetValue(currencyCode, out culture)) 
      return string.Format(culture, "{0:C}", amount); 
     return amount.ToString("0.00"); 
    } 
} 

यहाँ कुछ अलग मुद्रा कोड के लिए FormatCurrency बुला के परिणाम हैं:

decimal amount = 100; 

amount.FormatCurrency("AUD"); //$100.00 
amount.FormatCurrency("GBP"); //£100.00 
amount.FormatCurrency("EUR"); //100,00 € 
amount.FormatCurrency("VND"); //100,00 ? 
amount.FormatCurrency("IRN"); //? 100.00 
+0

अच्छा कार्यान्वयन। –

+0

धन्यवाद @ वेस्टर्न मेरे कोड में सुधार के लिए :) – jignesh

+2

ग्रेट स्निपेट, लेकिन 'c.LCID' के बजाय 'c.Name' का उपयोग करना बेहतर है क्योंकि आप मशीन-विशिष्ट [CultureNotFoundExceptions] (https://msdn.microsoft] प्राप्त कर सकते हैं। com/en-us/पुस्तकालय/system.globalization.culturenotfoundexception (v = vs.110) .aspx) –