0

文字列「-4.00%」があります。これを10進数に変換して、変数として宣言し、後で使用できるようにする必要があります。文字列自体はstring[]行にあります。私のコードは次のとおりです。

foreach (string[] row in rows)
{
string row1 = row[0].ToString();
Match rownum = Regex.Match(row1.ToString(), @"\-?\d+\.+?\d+[^%]");
string act = Convert.ToString(rownum); //wouldn't convert match to decimal
decimal actual = Convert.ToDecimal(act);
textBox1.Text = (actual.ToString());
}

これにより、「入力文字列が正しい形式ではありませんでした」という結果になります。何か案は?

ありがとう。

4

3 に答える 3

3

ここで、貢献できる2つのことが起こっているのがわかります。

正規表現の一致を文字列であると期待するかのように扱っていますが、一致が取得するのはMatchGroupです。

文字列に変換するのではなくrownum、を見る必要がありますrownum.Groups[0]

次に、キャプチャする括弧で囲まれた一致がありません。@"(\-?\d+\.+?\d+)%"ロット全体からキャプチャグループを作成します。これは問題ではないかもしれませんが、この状況でC#がどのように動作するかは正確にはわかりませんが、正規表現を拡張し始める場合は、括弧で囲まれたキャプチャグループを使用することをお勧めします。

于 2012-06-12T10:40:41.543 に答える
2

これは、キャプチャグループを使用して明示的にを探すように正規表現を変更するコードの変更バージョンです%。結果として、これにより10進数への解析も簡素化されます(中間文字列は不要になります)。

編集: コメントのエグゼキュータの提案に従ってチェックしてくださいrownum.Success

string[] rows = new [] {"abc -4.01%", "def 6.45%", "monkey" };

foreach (string row in rows)
{
    //regex captures number but not %
    Match rownum = Regex.Match(row.ToString(), @"(\-?\d+\.+?\d+)%");

    //check for match
    if(!rownum.Success) continue;

    //get value of first (and only) capture
    string capture = rownum.Groups[1].Value;

    //convert to decimal
    decimal actual = decimal.Parse(capture);

    //TODO: do something with actual
}
于 2012-06-12T10:43:00.577 に答える
1

これを処理するためにクラスを使用する場合は、一致のコレクションを取得するためにプロパティにMatchアクセスする必要があります。Match.Groupsこのクラスは、複数のオカレンスが出現することを前提としています。常に1つだけ取得できることを保証できる場合は、次の方法で取得できます。

string act = rownum.Groups[0];

それ以外の場合は、 MSDNドキュメントのように解析する必要があります。

于 2012-06-12T10:39:28.457 に答える