Как разобрать двойную строку с запятой? - PullRequest
2 голосов
/ 26 сентября 2019

Я пытаюсь разобрать значение с запятой в Double.

Пример:

var strValue = "-0,246";
double value = 0;
double.TryParse(strValue, NumberStyles.Float, CultureInfo.InvariantCulture, out value);

результат: 0.

Если я попытаюсь использовать NumberStyles.Any, результат будет 246 .

Как сделать правильный результат?

PS Iпопробуйте заменить запятую на точку на string.Это работает, но я думаю, что это сложное решение .

Ответы [ 4 ]

3 голосов
/ 26 сентября 2019

Вы должны указать ожидаемый формат культуры, однако вы можете просто указать числовой разделитель следующим образом:

Double.Parse(
   "-0,233", 
    new CultureInfo(CultureInfo.CurrentCulture.Name) 
    { 
       NumberFormat = new NumberFormatInfo() { NumberDecimalSeparator = ","} 
    }
)


2 голосов
/ 26 сентября 2019

Вы должны предоставить другую культуру, поскольку в InvariantCulture запятая , представляет собой тысячу разделителей , которые будут игнорироваться , когда разрешено (и т. Д.у вас есть -246 в случае NumberStyles.Any):

  "123,345,789" -> 123456789

Вы можете попробовать, скажем, CurrentCulture (если ваша текущая культура использует , в качестве десятичного разделителя)

double.TryParse(strValue, NumberStyles.Float, CultureInfo.CurrentCulture, out value);

Или поставить конкретную культуру, например русскую:

double.TryParse(strValue, NumberStyles.Float, CultureInfo.GetCultureInfo("ru-RU"), out value);
1 голос
/ 26 сентября 2019

Вы можете использовать NumberFormatInfo , например, так:

var strValue = "-0,246";
double value = 0;

// Create a NumberFormatInfo object
NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;
// Store the current value to restore it later
var currentSeperator = nfi.NumberDecimalSeparator;

// Change the seperator and parse the value
nfi.NumberDecimalSeparator = ",";
value = double.Parse(strValue, nfi);

// Restore the separator
nfi.NumberDecimalSeparator = currentSeperator;

В этом примере разделитель восстанавливается после анализа значения.

Приятно поставить этометод в методе расширения:

class DoubleExtensions
{
    public double ParseToDouble(this string strValue)
    {           
        // Create a NumberFormatInfo object
        NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

        // Store the current value to restore it later
        var currentSeperator = nfi.NumberDecimalSeparator;

        // Change the seperator and parse the value
        nfi.NumberDecimalSeparator = ",";

        try
        {
            if (double.TryParse(strValue, nfi, out var value))
            {
                return value;
            }           
        }
        finally
        {
            // Restore the separator
            nfi.NumberDecimalSeparator = currentSeperator;
        }

        return 0;
    }
}

И используйте его так:

var strValue = "-0,246";
double value = strValue.ParseToDouble();
0 голосов
/ 26 сентября 2019

Использование String.Replace для удаления запятых в числовых строках:

var strValue =" -0,246";
strValue = strValue.Replace(",", ".");
double value=0;
double.TryParse(strValue,NumberStyles.Float, CultureInfo.InvariantCulture, out value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...