Преобразовать строку в десятичную с форматом

Мне нужно преобразовать строку в десятичную в 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.


существует множество способов:

  1. System.Convert.ToDecimal("232.23")
  2. Double.Parse("232.23")
  3. double test; Double.TryParse("232.23", out test)

убедитесь,что вы пытаетесь поймать...


это новая функция под названием Символ Группировки Цифр.

действия:

  1. открыть область и язык в панели управления
  2. нажать на кнопку дополнительные настройки
  3. На вкладке номера
  4. Set Символ Группировки Цифр как пользовательская настройка. Изменить запятую; заменить на (любой символ от A до Z или { / ,}). Символ группировки цифр=e;

пример:

string checkFormate = "123e123";
decimal outPut = 0.0M;
decimal.TryParse(checkFormate, out outPut);
Ans: outPut=123123;