Заменить точку (.) Запятой (, ) используя RegEx?

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

Например:

Price= 100,00.56

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

Price= 100.00,56

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

7
задан Richard Everett 18 April 2012 в 12:09
поделиться

6 ответов

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

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

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

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

25
ответ дан 6 December 2019 в 04:53
поделиться

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

5
ответ дан 6 December 2019 в 04:53
поделиться

Также посмотрите

System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator
5
ответ дан 6 December 2019 в 04:53
поделиться

Не решение 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
ответ дан 6 December 2019 в 04:53
поделиться

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

var temp = price.Replace(".", "<TEMP>");
var temp2 = temp.Replace(",", ".");
var replaced = temp2.Replace("<TEMP>", ",");
4
ответ дан 6 December 2019 в 04:53
поделиться

Не полагайтесь на 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 использует другой вид представления. Я живу в DK и поэтому использую это, но вы должны использовать культуру, которая соответствует вашему продукту.

3
ответ дан 6 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: