4

我在将字符串解析为双精度时遇到问题。我有StreamWriter一个文本文件的阅读行。文本文件有以下几行:

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

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

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();

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

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

4

6 回答 6

2

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

于 2012-09-18T15:57:16.933 回答
1

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

于 2012-09-18T15:58:55.633 回答
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;
        }
于 2012-09-18T16:01:03.483 回答
0

您可以尝试使用 - 基于InvariantCulture

 var culture = CultureInfo.InvariantCulture;
 double result = double.Parse(par , culture);
于 2012-09-18T15:58:24.207 回答
0

您可以强制 double.Parse 使用,用作小数分隔符的区域性,如下所示:

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

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

于 2012-09-18T15:58:31.537 回答
0

我通过尝试使其工作,抓住:

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

谢谢大家的帮助。

于 2012-09-18T17:02:47.933 回答