2010-08-04 74 views
7

Estoy trabajando en una aplicación C#. Quiero cambiar la cifra decimal número con coma (,) donde tengo punto (.) Usando expresión regular.Reemplazar punto (.) Con coma (,) usando RegEx?

Por ejemplo:

Price= 100,00.56 

Como esta regla internacional de representar valores numéricos, pero me Suecia tienen diferentes maneras de números como

Price= 100.00,56 

Así que quiero cambiar de puntos en coma (.) (,) y coma (,) en punto (.) usando RegEx. Podría guiarme sobre esto.

Respuesta

23

dar formato a números, se debe utilizar el string format overload que toma un objeto CultureInfo. El nombre de cultura para sueco es "sv-SE", como se puede ver here.

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

Editar:

Como señala @OregonGhost - análisis sintáctico a cabo números también debe hacerse con CultureInfo.

+0

Virtual +1, lamentablemente me he quedado sin votos hoy. Pero sé que te lo has ganado. :) – sarnold

+0

grandes mentes ... snap +1 :-) –

+3

+1 para la solución canónica. Sin embargo, es importante señalar que esta no es solo la solución para * formatear *, sino también para * analizar * números. – OregonGhost

4

Puede hacer esto incluso sin regex. Por ejemplo

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

No estoy seguro de qué significa 100,00.56, ¿quisiste decir 10,000,56?
Para responder a su pregunta:

Para una tarea tan simple, ¿por qué usar RegEx? Usted puede hacer mucho más fácil:

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

Editar Estoy de acuerdo con @Oded, para los números de formato utilizan la clase CultureInfo.

+0

'100,00.56' es una representación en inglés,' 10.000,56' - Sweden/Russian/etc – abatishchev

+1

@abati: Creo que estaba hablando del hecho de que los ejemplos de OP tienen solo dos dígitos entre el separador de miles y el separador decimal. Probablemente sea solo un error tipográfico. –

+0

@ Alan: tienes razón, no se mencionó de inmediato – abatishchev

5

también echar un vistazo a

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

No confíe en RegExp para este tipo de cosas :) Utilice la acumulación en las culturas fx:

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

es-a analizar correctamente y da-DK usa el otro tipo de representación. Vivo en DK y, por lo tanto, lo uso, pero debes usar la cultura que se ajuste a tu resultado.

4
No

una solución RegEx pero desde mi experiencia - más correcta:

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é hace este método? Asegura que si una cadena dada es incorrecta pero suena correcta, conviértala a Suecia, por ej. 100,00 -> 100,00 pero 100.00 -> 100,00.

Cuestiones relacionadas