Преобразовать строку в десятичную с форматом
Мне нужно преобразовать строку в десятичную в C#, но эта строка имеет разные форматы.
например:
"50085"
"500,85"
"500.85"
Это должно быть преобразовано для 500,85 в десятичный. Есть ли упрощенная форма для этого преобразования с использованием формата?
6 ответов
в то время как десятичные.Метод Parse() метод, который вы ищете, вам придется предоставить немного больше информации. Он не будет автоматически выбирать между 3 форматами, которые вы даете, вам придется сказать ему, какой формат вы ожидаете (в виде IFormatProvider). Обратите внимание, что даже с IFormatProvider я не думаю, что "50085" будет правильно втянут.
единственное, что я вижу, это то, что из ваших примеров вы всегда ожидаете два знака после запятой точности. Если это так, вы можете удалить все периоды и запятые, а затем разделить на 100.
может быть, что-то вроде:
public decimal? CustomParse(string incomingValue)
{
decimal val;
if (!decimal.TryParse(incomingValue.Replace(",", "").Replace(".", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out val))
return null;
return val / 100;
}
некоторые культуры используют запятую, чтобы указать плавающую точку. Вы можете проверить это со следующим кодом на странице aspx:
var x = decimal.Parse("500,85");
Response.Write(x + (decimal)0.15);
это дает ответ 501, когда культура потока была установлена в культуру, которая использует запятую как плавающую точку. Вы можете заставить это так:
var x = decimal.Parse("500,85", new NumberFormatInfo() { NumberDecimalSeparator = "," });
это будет работать, в зависимости от настроек культуры:
string s = "500.85";
decimal d = decimal.Parse(s);
если ваша культура по умолчанию не позволяет ,
вместо .
в качестве десятичной точки, вы, вероятно, нужно:
s = s.Replace(',','.');
но нужно будет проверить несколько .
'ы... это, похоже, сводится к большей проблеме дезинфекции входных данных. Если вы можете проверить и санировать входные данные, чтобы все соответствовали набору правил, преобразование в decimal будет намного проще.
попробуйте этот код ниже:
string numValue = "500,85";
System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("fr-FR");
decimal decValue;
bool decValid = decimal.TryParse(numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue);
if (decValid)
{
lblDecNum.Text = Convert.ToString(decValue, culInfo.NumberFormat);
}
поскольку я даю значение 500,85, я предположу, что культура французская, и, следовательно, десятичный разделитель ",
". Затем десятичные.TryParse (numValue, System.Глобализация.NumberStyles.Номер, culInfo.NumberFormat, out decValue);
возвращает значение как 500.85 в decValue. Аналогично, если пользователь является английским US, измените конструктор culInfo.
существует множество способов:
System.Convert.ToDecimal("232.23")
Double.Parse("232.23")
-
double test;
Double.TryParse("232.23", out test)
убедитесь,что вы пытаетесь поймать...
это новая функция под названием Символ Группировки Цифр.
действия:
- открыть область и язык в панели управления
- нажать на кнопку дополнительные настройки
- На вкладке номера
- Set Символ Группировки Цифр как пользовательская настройка. Изменить запятую; заменить на (любой символ от A до Z или { / ,}). Символ группировки цифр=e;
пример:
string checkFormate = "123e123";
decimal outPut = 0.0M;
decimal.TryParse(checkFormate, out outPut);
Ans: outPut=123123;