Возникают трудности с преобразованием строки в десятичную - PullRequest
1 голос
/ 24 мая 2011

Спасибо, что нашли время помочь мне с моей проблемой.

В коде, который я пишу, я перебираю таблицу, получаю соответствующие значения (подтвердил это с помощью отладчика) и анализирую их перед соответствующими типами и, наконец, добавляю ихк объекту, который нужно сериализовать в XML.

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

if (DateTime.TryParse(dateString, culture, styles, out date))
{
   decimal LastValue;
   string vrednost = String.Format("{0:0,0.0}", 
                       row.SelectSingleNode("td[2]").InnerText);

   if (Decimal.TryParse(vrednost, out LastValue))
      list.Add(new StockEntry
                  {
                     Date = date,
                     PoslednaCena = LastValue
                     ...
                  }

Обратите внимание, что значение vrednost равно 4.451,00, и я подозреваю, что если я преобразую его в 4 451,00, он будет проанализирован.

Мне удалось выполнить синтаксический анализdate в соответствующее значение datetime.Однако значение LastValue всегда равно 0. Я исчерпал все известные мне ресурсы.У вас есть идеи, как решить мою проблему?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 24 мая 2011

Это форматирование ничего не даст, потому что вы не можете форматировать строки, подобные этой.Вы должны использовать метод синтаксического анализа с дополнительными параметрами и указать свой собственный формат

string s2 = "4.451,00";    
NumberFormatInfo numberFormatInfo = new NumberFormatInfo();
numberFormatInfo.NumberDecimalSeparator = ",";
numberFormatInfo.NumberGroupSeparator = ".";
var d = decimal.Parse(s2, numberFormatInfo);
0 голосов
/ 24 мая 2011

Ваш row.SelectSingleNode ("td [2]"). InnerText является строкой , и вы пытаетесь отформатировать ее как десятичное число.

Попробуйтепарсинг напрямую:

decimal LastValue;
string vrednost = row.SelectSingleNode("td[2]").InnerText;

if (Decimal.TryParse(vrednost, out LastValue))

Сначала проверьте вашу информацию о культуре и установите ее соответствующим образом.

CultureInfo MyUsersCulture = Thread.CurrentThread.CurrentCulture;
Console.WriteLine("The culture: "+ MyUsersCulture.Name);
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
ConsoleWriteLine("The culture: " + Thread.CurrentThread.CurrentCulture);
0 голосов
/ 24 мая 2011

Я думаю, что ваша проблема может быть связана с культурой, используемой для анализа.Попробуйте использовать CultureInfo.InvariantCulture для вашего анализа.Он должен работать с "," в качестве разделителя тысяч и "."в качестве десятичного разделителя.

Decimal.TryParse(vrednost, NumberStyles.Number, CultureInfo.InvariantCulture, out LastValue);

Если вы хотите поменять их местами, вы можете использовать другую культуру.Итальянский, например, работает с вашим форматом (не уверен насчет других), поэтому ваш код для «4.451,00» будет выглядеть так:В какой-то культуре, которая делает то, что вы хотите, вы можете просто создать свой класс NumberFormatInfo и передать его методу parse.

NumberFormatInfo decimalNumber = new NumberFormatInfo();
decimalNumber.NumberDecimalSeparator = ",";
decimalNumber.NumberGroupSeparator = ".";
Decimal.TryParse(vrednost, NumberStyles.Number, decimalNumber, out LastValue);
...