4

文字列を double に解析する際に問題があります。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". 本当に、なぜ文字列を double に変換できないのか、私にはわかりません。

私が間違っていることを教えていただければ幸いです。

4

6 に答える 6

2

「par」変数には、「(100,98)」のような文字列が含まれているため、解析に失敗しています。

于 2012-09-18T15:57:16.933 に答える
1

正規表現をに変更します(?<=\()(([^)]*))(?=\))

于 2012-09-18T15:58:55.633 に答える
0

- に基づいて試すことができますInvariantCulture

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

私は試してみて、キャッチして、それを機能させました:

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

皆さん、助けてくれてありがとう。

于 2012-09-18T17:02:47.933 に答える
0

次のように、double.Parse に,小数点記号として使用するカルチャを使用させることができます。

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

プログラムを異なる地域設定のコンピューターでも動作させたい場合は、とにかく良い考えです。

于 2012-09-18T15:58:31.537 に答える
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 に答える