将字符串转换为十进制有困难

时间:2011-05-24 17:14:21

标签: c# .net decimal

感谢您抽出宝贵时间协助解决我的问题。

在我正在编写的代码中,我正在遍历一个表,我得到了适当的值(使用调试器确认它),我之前将它们解析为适当的类型,最后我将它们添加到一个对象中被序列化为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,它将被解析。

我已成功将日期解析为适当的日期时间值。但是,LastValue的值始终为0.我已经耗尽了我所知道的所有资源。你知道如何解决我的问题吗?

提前谢谢!

3 个答案:

答案 0 :(得分:1)

此格式化不会执行任何操作,因为您无法格式化此类字符串。您必须使用带有其他参数的parse方法并指定您自己的格式

string s2 = "4.451,00";    
NumberFormatInfo numberFormatInfo = new NumberFormatInfo();
numberFormatInfo.NumberDecimalSeparator = ",";
numberFormatInfo.NumberGroupSeparator = ".";
var d = decimal.Parse(s2, numberFormatInfo);

答案 1 :(得分:0)

我认为您的问题可能是由于用于解析的文化。尝试使用CultureInfo.InvariantCulture进行解析。它应该使用“,”作为千位分隔符和“。”作为小数点分隔符。

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

如果你想交换它们,你可以使用另一种文化。例如,意大利语适用于您的格式(不确定其他格式),因此您的“4.451,00”代码将如下所示:

Decimal.TryParse(vrednost, NumberStyles.Number, CultureInfo.GetCultureInfo("it"), out LastValue);

如果您想使用自定义文化而不是强制实现您想要的文化,您可以简单地创建NumberFormatInfo类并将其传递给parse方法。

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

答案 2 :(得分:0)

你的 row.SelectSingleNode(" td [2]")。InnerText 是一个字符串,你试图像小数一样格式化它

尝试直接解析它:

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

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

首先检查您的cultureinfo并正确设置。

CultureInfo MyUsersCulture = Thread.CurrentThread.CurrentCulture;
Console.WriteLine("The culture: "+ MyUsersCulture.Name);
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
ConsoleWriteLine("The culture: " + Thread.CurrentThread.CurrentCulture);