2010-08-04 10 views
7

मैं एक सी # आवेदन पर काम कर रहा हूं। मैं अल्पविराम (,) के साथ संख्या दशमलव आंकड़ा बदलना चाहता हूं जहां मेरे पास नियमित अभिव्यक्ति का उपयोग करके डॉट (।) है।RegEx का उपयोग कर अल्पविराम (,) के साथ डॉट (।) को बदलें?

उदाहरण के लिए:

Price= 100,00.56 

संख्यात्मक मान, लेकिन मैं स्वीडन का प्रतिनिधित्व करने के लिए इस अंतरराष्ट्रीय नियम के रूप में वे की तरह

Price= 100.00,56 

संख्या के लिए अलग अलग तरीकों से है तो मैं डॉट अल्पविराम में बदलना चाहते हैं (।) (,) और अल्पविराम (,) RegEx का उपयोग कर डॉट (।) में। इस बारे में मुझे मार्गदर्शन कर सकता है।

उत्तर

23

के लिए जब संख्या स्वरूपण, आप string format overload कि एक CultureInfo वस्तु लेता है का उपयोग करना चाहिए। स्वीडिश के लिए संस्कृति का नाम "sv-SE" है, जैसा कि here देखा जा सकता है।

decimal value = -16325.62m; 
Console.WriteLine(value.ToString(CultureInfo.CreateSpecificCulture("sv-SE"))); 

संपादित:

@OregonGhost के रूप में बताते हैं - बाहर पार्स करने संख्या भी CultureInfo से किया जाना चाहिए।

+0

वर्चुअल +1, दुख की बात है कि मैं आज वोटों से बाहर हूं। लेकिन पता है कि आपने इसे अर्जित किया है। :) – sarnold

+0

महान दिमाग .. स्नैप +1 :-) –

+3

कैननिकल समाधान के लिए +1। यह ध्यान रखना महत्वपूर्ण है कि यह न केवल * स्वरूपण * के लिए समाधान है, बल्कि * पार्सिंग * संख्याओं के लिए भी है। – OregonGhost

4

आप इसे बिना रेगेक्स के भी कर सकते हैं। उदाहरण

var temp = price.Replace(".", "<TEMP>"); 
var temp2 = temp.Replace(",", "."); 
var replaced = temp2.Replace("<TEMP>", ","); 
4

सुनिश्चित नहीं है कि 100,00.56 क्या दर्शाता है, क्या आपका मतलब 10.000,56 था?
अपने प्रश्न का उत्तर देने के लिए:

इस तरह के एक साधारण कार्य के लिए, RegEx का उपयोग क्यों करें? आप इसे बहुत आसान कर सकते हैं:

string oldValue = "100,00.56"; 
char dummyChar = '&'; //here put a char that you know won't appear in the strings 
var newValue = oldValue.Replace('.', dummyChar) 
         .Replace(',', '.') 
         .Replace(dummyChar, ','); 

संपादित मैं, @Oded से सहमत स्वरूपण संख्या के लिए CultureInfo वर्ग का उपयोग करें।

+0

'100,00.56' एक अंग्रेजी प्रतिनिधित्व है,' 10।000,56' - स्वीडन/रूसी/आदि – abatishchev

+1

@abati: मुझे लगता है कि वह इस तथ्य के बारे में बात कर रहे थे कि ओपी के उदाहरणों में हजारों विभाजक और दशमलव विभाजक के बीच केवल दो अंक हैं। यह शायद सिर्फ एक टाइपो है। –

+0

@Alan: आप सही हैं, अभी उल्लेख नहीं किया गया है – abatishchev

5

इसके अलावा

System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator 
3

पर एक नजर है बात :) उपयोग इस तरह की संस्कृतियों fx में निर्माण के लिए रेगुलर एक्सप्रेशन पर भरोसा न करें:

decimal s = decimal.Parse("10,000.56", NumberStyles.Currency, CultureInfo.GetCultureInfo("en-US")); 
string output = s.ToString("N",CultureInfo.GetCultureInfo("da-DK")); 

en-US इसे सही ढंग से पार्स जाएगा और दा-डीके अन्य प्रकार के प्रतिनिधित्व का उपयोग करता है। मैं डीके में रहता हूं और इसलिए इसका उपयोग करता हूं लेकिन आपको उस संस्कृति का उपयोग करना चाहिए जो आपके आउटपुट को फिट करता है।

4

नहीं एक रेगुलर एक्सप्रेशन से समाधान लेकिन मेरे अनुभव से - अधिक सही:

public static string CheckDecimalDigitsDelimiter(this string instance) 
{ 
    var sv = new CultureInfo("sv-SE"); 
    var en = new CultureInfo("en-US"); 

    decimal d; 
    return (!Decimal.TryParse(instance, NumberStyles.Currency, sv, out d) && 
      Decimal.TryParse(instance, NumberStyles.Currency, en, out d)) ? 
     d.ToString(sv) : // didn't passed by SV but did by EN 
     instance; 
} 

इस विधि क्या करता है? यह सुनिश्चित करता है कि यदि दी गई स्ट्रिंग स्वीडन स्ट्रिंग गलत है लेकिन सही अंग्रेजी है - इसे स्वीडन में बदलें, उदा। 100,00 -> 100,00 लेकिन 100.00 -> 100,00

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