none
Ошибка FormatException при использовании Decimal.Parse. RRS feed

  • Вопрос

  • Нужно вывести на консоль

    Console.WriteLine(linqDoc.Descendants(nameSpace + "SalesPerson"

    )

    .Where(el => el.Attribute(

    "salesQuota") != null

    )

    .Sum(el =>

    decimal.Parse(el.Attribute("salesQuota").Value)));

    где el:

    <SalesPerson salesPersonId="275" salesQuota="300000.0000" firstName="Michael" lastName="Blythe" email="michael9@adventure-works.com" xmlns="http://adventureworks.com/2006/sales">
      <SalesOrder territory="Central" date="2003-12-01T00:00:00" subTotal="20.0688" taxAmount="1.6055" freight="0.5017" />
      <SalesOrder territory="Central" date="2003-03-01T00:00:00" subTotal="24.6935" taxAmount="1.9755" freight="0.6173" />
      <SalesOrder territory="Central" date="2003-12-01T00:00:00" subTotal="45.9466" taxAmount="3.6757" freight="1.1487" />
      <SalesOrder territory="Southwest" date="2003-12-01T00:00:00" subTotal="45.9466" taxAmount="3.6757" freight="1.1487" />
    </SalesPerson>

    Выдает ошибку FormatException. Не пойму почему.

    29 апреля 2011 г. 10:06

Ответы

  • Все делал вот так 

     

    // Gets a NumberFormatInfo associated with the en-US culture.

     

    NumberFormatInfo nfi = new CultureInfo("en-US", false

    ).NumberFormat;

     

     

    //using extension methods and lambda expressions

     

    Console.WriteLine(linqDoc.Descendants(nameSpace + "SalesPerson"

    )

    .Where(el => el.Attribute(

    "salesQuota") != null

    )

    .Sum(el =>

    decimal.Parse(el.Attribute("salesQuota").Value, nfi)));

    • Помечено в качестве ответа Sharpei Syroed 29 апреля 2011 г. 11:12
    29 апреля 2011 г. 11:11

Все ответы

  •  

    потому что наверняка стоят региональные параметры ru-RU, а в этих региональных параметрах      

       CurrencyDecimalSeparator  = ","

    как вариант  - меняй "." на ","

    29 апреля 2011 г. 10:27
  •  

    потому что наверняка стоят региональные параметры ru-RU, а в этих региональных параметрах      

       CurrencyDecimalSeparator  = ","

    как вариант  - меняй "." на ","


    Спасибо. Да именно так. Я поменял так как вы сказали. Только в первой строчке. И у меня кинуло исключение на следующей стрроке. 

    У меня в файле этих строк очень много. Поэтому еще вопрос  -  может мне указать в настройках CurrencyDecimalSeparator  = ","? И как это сделать?

    29 апреля 2011 г. 10:56
  • Все делал вот так 

     

    // Gets a NumberFormatInfo associated with the en-US culture.

     

    NumberFormatInfo nfi = new CultureInfo("en-US", false

    ).NumberFormat;

     

     

    //using extension methods and lambda expressions

     

    Console.WriteLine(linqDoc.Descendants(nameSpace + "SalesPerson"

    )

    .Where(el => el.Attribute(

    "salesQuota") != null

    )

    .Sum(el =>

    decimal.Parse(el.Attribute("salesQuota").Value, nfi)));

    • Помечено в качестве ответа Sharpei Syroed 29 апреля 2011 г. 11:12
    29 апреля 2011 г. 11:11
  • Лучше указать конкретный CultureInfo вторым параметром для Parse. Например:

    Decimal.Parse(el.Attribute("salesQuota").Value, System.Globalization.CultureInfo.InvariantCulture);
    
    

    Сменить культуру для потока можно через:

    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
    

     


    My blog | My pet project
    • Предложено в качестве ответа John Wolter 7 февраля 2012 г. 11:59
    29 апреля 2011 г. 11:13
    Модератор