2010-08-04 27 views
7

Ich arbeite an einer C# -Anwendung. Ich möchte Zahl Dezimalzahl mit Komma (,) ändern, wo ich Punkt (.) Mit regulären Ausdruck haben.Punkt (.) Durch Komma (,) mit RegEx ersetzen?

Zum Beispiel:

Price= 100,00.56 

Da diese internationale Regel numerische Werte zu repräsentieren, aber ich Schweden haben sie verschiedene Möglichkeiten für Zahlen wie

Price= 100.00,56 

So möchte ich Punkt ändern, in Komma (.) (,) und Komma (,) in Punkt (.) mit RegEx. Könnte mich dazu führen.

Antwort

23

Wenn der Formatierung von Zahlen, sollten Sie die string format overload verwenden, die eine CultureInfo Aufgabe übernimmt. Der Kulturname für schwedisch ist "sv-SE", wie man sehen kann here.

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

bearbeiten:

Wie @OregonGhost weist darauf hin - Parsen aus Zahlen sollten auch mit CultureInfo erfolgen.

+0

Virtual +1, leider habe ich heute keine Stimmen mehr. Aber wissen Sie, dass Sie es verdient haben. :) – sarnold

+0

tolle Köpfe .. snap +1 :-) –

+3

+1 für die kanonische Lösung. Es ist jedoch wichtig zu beachten, dass dies nicht nur die Lösung für die * Formatierung *, sondern auch für das * Analysieren * von Zahlen ist. – OregonGhost

4

Sie können dies auch ohne Regex tun. Zum Beispiel

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

Nicht sicher, was 100,00.56 darstellt, meinst du 10.000,56?
Um Ihre Frage zu beantworten:

Für solch eine einfache Aufgabe, warum RegEx verwenden? Sie können es viel einfacher machen:

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, ','); 

bearbeiten Ich stimme mit @Oded, für Formatierung von Zahlen die CultureInfo Klasse.

+0

'100,00.56' ist eine englische Darstellung,' 10.000,56' - Schweden/Russisch/etc – abatishchev

+1

@abati: Ich denke, er hat davon gesprochen, dass die Beispiele des OP nur zwei Ziffern zwischen dem Tausendertrennzeichen und dem Dezimaltrennzeichen haben. Es ist wahrscheinlich nur ein Tippfehler. –

+0

@Alan: Du hast recht, nicht sofort erwähnt – abatishchev

5

haben auch einen Blick auf

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

nicht für diese Art der Sache :) Nutzung auf RegExp Verlassen Sie die Build-in Kulturen 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 wird es richtig analysieren und Da-DK verwendet die andere Art der Darstellung. Ich lebe in DK und nutze das, aber du solltest die Kultur verwenden, die zu deiner Leistung passt.

4

kein RegEx Lösung aber aus meiner Erfahrung - richtiger:

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

Was bedeutet diese Methode tun? Es stellt sicher, dass, wenn die angegebene Zeichenfolge inkorrekt ist, die schwedische Zeichenfolge, aber das korrekte Englisch ist - konvertieren Sie sie nach Schweden, z. 100,00 -> 100,00 aber 100.00 -> 100,00.

Verwandte Themen