Заменить точку (.) Запятой (,), используя RegEx? - PullRequest
7 голосов
/ 04 августа 2010

Я работаю над приложением C #.Я хочу изменить десятичное число с запятой (,), где у меня есть точка (.) С использованием регулярного выражения.

Например:

Price= 100,00.56

Как это международное правило представления числовых значенийВ Швеции для чисел существуют разные способы, такие как

Price= 100.00,56

Поэтому я хочу изменить точку (.) На запятую (,) и запятую (,) на точку (.) С помощью RegEx.Не могли бы вы рассказать мне об этом.

Ответы [ 6 ]

24 голосов
/ 04 августа 2010

При форматировании чисел следует использовать перегрузку форматирования строки , которая принимает объект CultureInfo. Культурное название для шведского языка "sv-SE", как можно увидеть здесь .

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

Редактировать

Как указывает @OregonGhost - разбор чисел также должен выполняться с помощью CultureInfo.

5 голосов
/ 04 августа 2010

Также взгляните на

System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator
5 голосов
/ 04 августа 2010

Не уверен, что означает 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.

4 голосов
/ 04 августа 2010

Не решение RegEx, но по моему опыту - более правильно:

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.

4 голосов
/ 04 августа 2010

Вы можете сделать это даже без регулярных выражений. Например

var temp = price.Replace(".", "<TEMP>");
var temp2 = temp.Replace(",", ".");
var replaced = temp2.Replace("<TEMP>", ",");
3 голосов
/ 04 августа 2010

Не полагайтесь на RegExp для такого рода вещей :) Используйте сборку в культурах 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 проанализирует его правильно, а da-DK использует другой тип представления.Я живу в ДК и поэтому использую это, но вы должны использовать ту культуру, которая соответствует вашим результатам.

...