2011-08-03 14 views
16

मैं एक विशिष्ट संस्कृति के लिए मुद्रा पैटर्न कैसे प्राप्त करूं?विशिष्ट संस्कृति मुद्रा पैटर्न कैसे प्राप्त करें

के बजाय का उपयोग कर:

उदाहरण के लिए

string.Format("{0:c}", 345.10) 

मैं इस का उपयोग करना चाहते:।

string.Format("#.##0,00 €;-#.##0,00 €", 345.10); 

लेकिन मैं कैसे पैटर्न स्ट्रिंग (# की तरह "मिलता है ## 0,00 €; - #। ## 0,00 € ") प्रत्येक संस्कृति के लिए मेरे आवेदन की ज़रूरत है?

मैं "{0: c}" पैटर्न का उपयोग नहीं कर सकता क्योंकि यदि उपयोगकर्ता भाषा को स्विच करता है तो मुद्रा समान होनी चाहिए।

उत्तर

18

CultureInfo में NumberFormatInfo है और यह वर्ग (अन्य चीजों के साथ) उस के लिए मुद्रा को प्रारूपित करने का वर्णन करता है विशेष संस्कृति

विशेष रूप से आप CurrencyPositivePattern और CurrencyNegativePattern का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि सही मुद्रा प्रतीक प्राप्त करने के लिए मुद्रा के पहले या बाद में CurrencySymbol रखा गया है या नहीं। इन सभी जानकारी का उपयोग किया जाता है।नेट जब C प्रारूप विनिर्देशक का उपयोग किया जाता है।

आप एमएसडीएन पर NumberFormatInfo class के बारे में अधिक पढ़ सकते हैं।

नीचे दिया गया कोड मुद्रा को उचित रूप से प्रारूपित करने के लिए आवश्यक कुछ चरणों का प्रदर्शन करता है। यह केवल CurrencySymbol, CurrencyPositivePattern और CurrencyDecimalDigits का उपयोग करता है और इस तरह अधूरा है:

var amount = 123.45M; 
var cultureInfo = CultureInfo.GetCultureInfo("da-DK"); 

var numberFormat = cultureInfo.NumberFormat; 
String formattedAmount = null; 
if (amount >= Decimal.Zero) { 
    String pattern = null; 
    switch (numberFormat.CurrencyPositivePattern) { 
    case 0: 
     pattern = "{0}{1:N" + numberFormat.CurrencyDecimalDigits + "}"; 
     break; 
    case 1: 
     pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}{0}"; 
     break; 
    case 2: 
     pattern = "{0} {1:N" + numberFormat.CurrencyDecimalDigits + "}"; 
     break; 
    case 3: 
     pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "} {0}"; 
     break; 
    } 
    formattedAmount = String.Format(cultureInfo, pattern, numberFormat.CurrencySymbol, amount); 
} 
else { 
    // ... 
} 

Console.WriteLine(formattedAmount); 
बेशक

आप बस इस्तेमाल कर सकते हैं:

var amount = 123.45M; 
var cultureInfo = CultureInfo.GetCultureInfo("da-DK"); 
var formattedAmount = String.Format(cultureInfo, "{0:C}", amount); 
Console.WriteLine(formattedAmount); 
+0

इस तरह से मैं कोशिश कर रहा हूँ। क्या मुझे एक स्विच लागू करना है जो मेरे स्वयं द्वारा चुने गए पैटर्न का उपयोग करता है? उदाहरण के लिए CurrencyNegativePattern में 15 विकल्प हैं। या int संख्या के बजाय स्ट्रिंग मान प्राप्त करने का कोई तरीका है? संपादित करें: आपने पहले ही उत्तर दिया है। – naishx

2

क्या आपने string.Format("{0:N2} €", 345.10) का उपयोग करने का प्रयास किया है? यह उपयोगकर्ताओं की संस्कृति में 2 दशमलव स्थानों के लिए एक स्थान और यूरो प्रतीक के बाद प्रारूपित होना चाहिए।

+0

मैंने इस तरह कुछ के बारे में सोचा, लेकिन कुछ भाषाओं में मुद्रा प्रतीक मूल्य विस्तार से पहले है: "एसएफआर 123'456.00" – naishx

+0

मुझे लगता है कि मैंने तब प्रश्न को गलत समझा। मैंने सोचा था कि आप लोकेल के बावजूद मुद्रा को यूरो के रूप में बनाए रखने की कोशिश कर रहे थे। – detaylor

1

नीचे परीक्षण दिखाता है तुम ऐसा कैसे प्राप्त कर सकते हैं:

[Test] 
    public void DisplayEurosInGreeceAndEngland() 
    { 
     var val = 125.22m; 
     Thread.CurrentThread.CurrentCulture 
      = Thread.CurrentThread.CurrentUICulture 
       = new CultureInfo("el-GR"); 

     Console.WriteLine(string.Format("{0:n} €", val)); 

     Thread.CurrentThread.CurrentCulture 
      = Thread.CurrentThread.CurrentUICulture 
       = new CultureInfo("en-GB"); 

     Console.WriteLine(string.Format("{0:n} €", val)); 
    } 

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

+1

धन्यवाद लेकिन मैं इस समाधान का उपयोग नहीं कर सकता क्योंकि मैं DevExpress ग्रिड का उपयोग करता हूं और यह केवल स्ट्रिंग प्रारूप पैटर्न स्वीकार करता है। – naishx

+0

मुझे लगता है कि आप विशेष रूप से {0: n} का उपयोग कर सकते हैं। यहां जानकारी देखें: http://documentation.devexpress.com/#WindowsForms/CustomDocument2141 –

+1

'{0: n}' प्रारूप _Number_ प्रारूप का उपयोग करता है, पुस्तकालय _Currency_ प्रारूप से अलग करने के लिए बहुत अधिक लंबाई तक जाता है । और कुछ देशों में जो बहुत मायने रखता है। –

0

आप/अपनी मुद्रा फ़ॉर्मेट करने के लिए डबल का उपयोग कर की जरूरत है:

money.ToString("C", culture); 

कठिन हिस्सा वास्तव में आईएसओ कोड के आधार पर सही संस्कृति हो रही है। मुझे नहीं पता कि आप जिस संस्कृति की जरूरत रखते हैं उसका ट्रैक कैसे रखें। ध्यान रखें कि यह केवल आपके पैसे के स्वरूपण रूपांतरण विभिन्न मुद्राओं/संस्कृतियों के लिए है!

अधिक विस्तार:

ISOCurrencySymbol RegionInfo, जो आप CultureInfo है, जो आप अपने वर्तमान धागा की संस्कृति सेटिंग्स से प्राप्त कर सकते हैं के आधार पर बना सकते हैं का एक हिस्सा है। आपको एक सिंगलटन बनाना चाहिए जो ISOCurrencyCode से CultureInfo में कनवर्ट करने के लिए एक शब्दकोश को लागू करता है।

10

मुझे लगता है कि आप क्या पूछ रहे हैं मुद्रा चिह्न को बदलने के लिए, लेकिन संस्कृति-विशिष्ट स्वरूपण को कैसे रखें।

Thread.CurrentThread.CurrentCulture = new CultureInfo("de"); 
// pretend we are german 

var nfi = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone(); 
nfi.CurrencySymbol = "$$$"; 
Console.WriteLine(string.Format(nfi,"{0:c}",345.10)); 

हो जाएगा ताकि उत्पादन:

345,10 $$$ 

CurrentCulture यह आउटपुट को बदलने के बिना (मेरे लिए):

आप वर्तमान NumberFormatInfo की एक प्रति हो रही है और CurrencySymbol संपत्ति को संशोधित करके ऐसा कर सकते हैं
$$$345.10 
2

त्वरित और गंदे दृष्टिकोण है कि सभी नंबर प्रारूपों के लिए काम करता है:

var culture = CultureInfo.GetCultureInfo("el-GR"); 
var numberFormat = (NumberFormatInfo)culture.NumberFormat.Clone(); 
numberFormat.CurrencySymbol = "€"; // Force the currency symbol regardless of culture 
var specifier = "C";    // Or any other format specifier 
var positivePattern = 1110.ToString(specifier, numberFormat).Replace('1', '#'); 
var negativePattern = (-1110).ToString(specifier, numberFormat).Replace('1', '#'); 
var pattern = positivePattern + ";" + negativePattern; 

इस मामले में, पैटर्न "#। ## 0,00 €; - #। ## 0,00 €" के बराबर है। यह सभी क्रमपरिवर्तनों को समझने की कोशिश कर रहे कई सिरदर्द से बचाता है। मैं पूछे जाने वाले प्रश्न की सराहना करता हूं, क्योंकि इससे मदद मिली और मुझे एक आसान जवाब खोजने के लिए मजबूर किया गया।