不能double.Parse字符串

时间:2012-09-18 15:50:46

标签: c# string parsing

我将字符串解析为double时遇到问题。我有一个来自文本文件的StreamWriter个读数行。文本文件包含以下行:

17-09-2012: (100,98)
17-09-2012: (50,57)

现在,我想使用parantheses中的值,将它们一起添加并在文本框中显示。到目前为止,我有以下内容:

int counter = 0;
double res = 0;
string line;

System.IO.StreamReader file = new System.IO.StreamReader("d:\\test.txt");
while ((line = file.ReadLine()) != null)
{
    string par = Regex.Match(line, @"\(([^)]*)\)").Value;
    double par2 = double.Parse(par);
    res += par2;

    counter++;
}
file.Close();
textBox1.Text = res.ToString();

然而,显然输入字符串的格式不正确,我发现这很奇怪,因为正则表达式应该删除除了parantheses中的数字之外的所有内容。我甚至通过将字符串写入文本框而没有先将它们添加到一起来检查这一点,它显示"100,9850,57"。所以真的,我不明白,为什么它不能将字符串转换为双精度。

我希望你能告诉我,我做错了什么。

6 个答案:

答案 0 :(得分:2)

你的“par”变量包含一个类似于“(100,98)”的字符串,这就是它无法解析的原因。

答案 1 :(得分:1)

将正则表达式更改为(?<=\()(([^)]*))(?=\))

答案 2 :(得分:0)

您可以尝试 - 基于InvariantCulture

 var culture = CultureInfo.InvariantCulture;
 double result = double.Parse(par , culture);

答案 3 :(得分:0)

你可以强制double.Parse使用一个使用,作为小数分隔符的文化,如下所示:

CultureInfo culture = new CultureInfo("de-DE");
double d = double.Parse(par, culture);

无论如何,如果您希望您的程序也可以在具有不同区域设置的计算机上运行,​​那么这是一个好主意。

答案 4 :(得分:0)

将正则表达式设置为(?<=\()(([^)]*))(?=\))并使用此帮助程序可以解决您的问题:

        public static double ParseDouble(string input)
        {
            // unify string (no spaces, only . )
            string output = input.Trim().Replace(" ", "").Replace(",", ".");

            // split it on points
            string[] split = output.Split('.');

            if (split.Count() > 1)
            {
                // take all parts except last
                output = String.Join("", split.Take(split.Count() - 1).ToArray());

                // combine token parts with last part
                output = String.Format("{0}.{1}", output, split.Last());
            }

            // parse double invariant
            double d = Double.Parse(output, CultureInfo.InvariantCulture);
            return d;
        }

答案 5 :(得分:0)

我通过试一试,抓住了它:

string par = Regex.Match(line, @"(?<=\()(([^)]*))(?=\))").Value;
                try
                {
                    double par2 = double.Parse(par);
                    res += par2;
                }
                catch
                {
                }

谢谢,大家帮忙。