Преобразовать строку в десятичную с форматом - PullRequest
8 голосов
/ 11 мая 2011

Мне нужно преобразовать строку в десятичное число в C #, но эта строка имеет разные форматы.

Например:

"50085"

"500,85"

"500,85"

Это должно быть преобразовано в 500,85 в десятичном виде.Существует ли упрощенная форма для преобразования с использованием формата?

Ответы [ 7 ]

17 голосов
/ 11 мая 2011

Некоторые культуры используют запятую для обозначения плавающей запятой.Вы можете проверить это с помощью следующего кода на странице aspx:

var x = decimal.Parse("500,85");
Response.Write(x + (decimal)0.15);

Это дает ответ 501, когда для культуры потока задано значение, в котором запятая используется в качестве плавающей запятой.Вы можете заставить это так:

var x = decimal.Parse("500,85", new NumberFormatInfo() { NumberDecimalSeparator = "," });
17 голосов
/ 11 мая 2011

Хотя decimal.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;
}
6 голосов
/ 11 мая 2011

Это будет работать, в зависимости от настроек вашей культуры:

string s = "500.85";
decimal d = decimal.Parse(s);

Если ваша культура по умолчанию не разрешает , вместо . в качестве десятичной точки, вам, вероятно, потребуется:

s = s.Replace(',','.');

Но нужно будет проверить несколько . ... это, кажется, сводится к большей проблеме очистки входных данных.Если вы сможете проверять и дезинфицировать входные данные, чтобы они соответствовали набору правил, преобразование в десятичное будет намного проще.

3 голосов
/ 11 мая 2011

Попробуйте этот код ниже:

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, я буду считать, что культура французская, и, следовательно, десятичный разделитель - ",". Тогда decimal.TryParse (numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue); вернет значение как 500.85 в decValue. Точно так же, если пользователь - английский США, измените конструктор culInfo.

1 голос
/ 19 октября 2012

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

Шаги:

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

Пример: * * один тысяча двадцать-одна

string checkFormate = "123e123";
decimal outPut = 0.0M;
decimal.TryParse(checkFormate, out outPut);
Ans: outPut=123123;
1 голос
/ 11 мая 2011

Есть множество способов:

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

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

0 голосов
/ 06 ноября 2018

Попробуйте

 public decimal AutoParse(string value)
    {
        if (Convert.ToDecimal("3.3") == ((decimal)3.3))
        {
            return Convert.ToDecimal(value.Replace(",", "."));
        }
        else
        {
            return Convert.ToDecimal(value.Replace(".", ","));
        }

    }
...