Я работаю над приложением C #. Я хочу изменить десятичное число числа запятой (,), где у меня есть точка (.) С использованием регулярного выражения.
Например:
Price= 100,00.56
В качестве этого международного правила представления числовых значений, но в Швеции они имеют различные способы для чисел.
Price= 100.00,56
Поэтому я хочу изменить точку (.) На запятую (,) и запятую (,) на точку (.), Используя RegEx. Мог бы подсказать мне об этом.
При форматировании чисел следует использовать перегрузку формата строки, которая принимает объект CultureInfo
. Название культуры для шведского языка - "sv-SE", как можно увидеть здесь.
decimal value = -16325.62m;
Console.WriteLine(value.ToString(CultureInfo.CreateSpecificCulture("sv-SE")));
Редактировать:
Как указывает @OregonGhost - разбор чисел также должен выполняться с помощью CultureInfo
.
Не уверен, что означает 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
.
Также посмотрите
System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator
Не решение 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
.
Вы можете сделать это даже без регулярного выражения. Например,
var temp = price.Replace(".", "<TEMP>");
var temp2 = temp.Replace(",", ".");
var replaced = temp2.Replace("<TEMP>", ",");
Не полагайтесь на 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 и поэтому использую это, но вы должны использовать культуру, которая соответствует вашему продукту.