c # преобразовать строку с запятой в число - PullRequest
0 голосов
/ 05 марта 2019

Итак, у меня есть этот вход: 3,000,000

И эта функция возвращает 30000M:

public static decimal? CustomParse(string incomingValue)
{
    decimal val;
    if (!decimal.TryParse(incomingValue.Replace(",", "").Replace(".", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out val))
        return null;
    return val / 100;
}

Каков наилучший способ преобразования этого вида на входе в numbber?

РЕДАКТИРОВАТЬ

Я также попробую это: *

Regex regex = new Regex(@"\d+");

И вывод 3

Ответы [ 3 ]

2 голосов
/ 05 марта 2019

Вы также можете сделать это

return Decimal.Parse(incomingValue, new CultureInfo("en-US"));

В en-US '.'это разделитель запятыми.Таким образом, он будет правильно анализировать текст.

Если в культуре указано, что "de-DE" 3 будет ожидаемым результатом преобразования, поскольку "," - это разделитель запятых.

ВашОднако регулярное выражение regex всегда даст вам 3, потому что оно просто соответствует [0-9]+ регулярным выражениям, не заботясь о настройках вашей культуры.Если вы хотите, чтобы регулярное выражение соответствовало вашему номеру, вы должны использовать что-то вроде

Regex regex = new Regex(@"\d+(,\d+)*");

Это будет соответствовать «123», а также «123,123», но не «123» или «123.»(в случае ведьмы он будет соответствовать части 123).

1 голос
/ 05 марта 2019

Использование IFormatProvider в decimal.Parse

var format = new NumberFormatInfo
{
    NumberGroupSeparator = ","
};

decimal res = decimal.Parse("3,000,000", format);
0 голосов
/ 05 марта 2019

Вы делите на 100, так что ваше число не будет 3 миллиона ... Вот решение:

class Program
  {
    static void Main(string[] args)
    {
      decimal? value = CustomParse("3,000,000");
      Console.WriteLine(value);
    }

    public static decimal? CustomParse(string incomingValue)
    {
      decimal val;
      if (!decimal.TryParse(incomingValue.Replace(",", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out val))
        return null;
      return val;
    }
  }
...