2010-08-04 7 views
7

Je travaille sur une application C#. Je veux changer le nombre décimal avec la virgule (,) où j'ai le point (.) En utilisant l'expression régulière.Remplacer le point (.) Par une virgule (,) en utilisant RegEx?

Par exemple:

Price= 100,00.56 

Cette règle internationale de représenter des valeurs numériques, mais je Suède, ils ont des façons différentes pour les nombres Comme

Price= 100.00,56 

donc je veux changer de point en virgule (.) (,) et virgule (,) en point (.) en utilisant RegEx. Pourrait me guider à ce sujet.

Répondre

23

Lors du formatage des nombres, vous devez utiliser le string format overload qui prend un objet CultureInfo. Le nom de culture pour suédois est "sv-SE", comme on peut le voir here.

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

Modifier:

Comme @OregonGhost souligne - l'analyse syntaxique des chiffres doit aussi être fait avec CultureInfo.

+0

Virtual +1, malheureusement, je n'ai plus de voix aujourd'hui. Mais sachez que vous l'avez gagné. :) – sarnold

+0

grands esprits .. snap +1 :-) –

+3

+1 pour la solution canonique. Il est important de noter cependant que ce n'est pas seulement la solution pour le * formatage *, mais aussi pour * l'analyse * des nombres. – OregonGhost

4

Vous pouvez le faire même sans regex. Par exemple

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

Vous ne savez pas ce que 100,00.56 représente, voulez-vous dire 10.000,56?
Pour répondre à votre question:

Pour une tâche simple, pourquoi utiliser RegEx? Vous pouvez le faire beaucoup plus facile:

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

Modifier Je suis d'accord avec @Oded, pour formater les nombres utilisent la classe CultureInfo.

+0

'100,00.56' est une représentation en anglais,' 10.000,56' - Suède/Russe/etc – abatishchev

+1

@abati: Je pense qu'il parlait du fait que les exemples de l'OP ont seulement deux chiffres entre le séparateur des milliers et le séparateur décimal. C'est probablement juste une faute de frappe. –

+0

@Alan: Vous avez raison, n'a pas mentionné tout de suite – abatishchev

5

ont également un oeil à

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

Ne comptez pas sur RegExp pour ce genre de chose :) Utilisez la construction dans les cultures 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 analysera correctement et da-DK utilise l'autre type de représentation. Je vis en DK et je l'utilise donc, mais vous devez utiliser la culture qui correspond à votre production.

4

Pas une solution RegEx mais de mon expérience - plus correcte:

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

Qu'est-ce que cette méthode faire? Il s'assure que si une chaîne donnée est incorrecte, la chaîne suédoise est correcte, mais l'anglais est correct - convertissez-la en Suède, par ex. 100,00 -> 100,00 mais 100.00 -> 100,00.

Questions connexes