2012-06-12 3 views
0

나는 변수로 선언하고 나중에 사용할 수 있도록 10 진수로 변환해야하는 "-4.00 %"문자열이 있습니다. 문자열 자체는 string [] 행에 있습니다. 내 코드는 다음과 같습니다.C# Regex.Match to decimal

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

결과적으로 "입력 문자열의 형식이 올바르지 않습니다." 어떤 아이디어?

감사합니다.

+0

가능한 중복 [방법 백분율 문자열을 이중으로 변환 하시겠습니까?] (http://stackoverflow.com/questions/2171615/how-to-convert-percentage-string-to-double) –

+1

아마도'act'는 끝에 퍼센트 기호가있는 문자열을 포함하고 있을까요? 명백한 이유 때문에 이것은 십진법으로 해석 될 수 없다. 정규식을 수정하여 캡처 그룹을 사용하여 (백분율이 아닌 값을 캡처하도록) 해당 캡처 값을 대신 변환하십시오. – WickyNilliams

+0

위에서 설명한 전체 솔루션을 보려면 아래에서 내 대답을 참조하십시오. – WickyNilliams

답변

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 
} 
+0

내가 틀렸다면 나를 정정한다. 그러나 "[^ %]"는 10 진수 문자열을 따라갈 수있는 '%'가 없다는 것을 의미하지는 않는다. 그 밖의 모든 것이 있습니까? – Franky

+0

올바른지, 위의 정규 표현식을 복사했는데, 나 자신에게 그것이 약간 iffy라고 생각했다. 그가 그의 요구 사항을 말했다 일치하는 정규식을 업데이트했습니다 – WickyNilliams

+0

위키,이 나에게 완벽하게 이해하지만 FormatException 결과 문자열 = 처리되지 않은 예외가되었다 rownum.Groups [1] .Value; 선. – user1442073

1

Match 클래스를 사용하여이 문제를 처리하려면 Match.Groups 속성에 액세스해야 일치하는 컬렉션을 가져와야합니다. 이 클래스는 둘 이상의 발생이 나타나는 것으로 가정합니다.

string act = rownum.Groups[0]; 

그렇지 않으면 당신이 MSDN documentation에로를 구문 분석해야합니다 : 당신은 당신이 항상 일을 얻을 것이다 보장 만 1 수 있다면 당신은 그것을 얻을 수 있습니다.

3

여기서 일어나는 두 가지 일이 발생합니다.

정규식 검색을 문자열로 예상하고 있지만 일치 검색은 MatchGroup입니다.

rownum을 문자열로 변환하는 대신 rownum.Groups[0]을 찾아야합니다.

두 번째로, 캡처 할 괄호 안의 일치 항목이 없습니다. @"(\-?\d+\.+?\d+)%"은 전체 로트에서 캡처 그룹을 생성합니다. 이것은 중요하지 않을 수도 있습니다. C#이이 상황에서 어떻게 작동하는지 정확히 알지 못합니다. 그러나 정규 표현식을 늘리면 대괄호로 묶은 캡처 그룹을 사용하여 계속 진행할 수 있습니다.

+0

실제로 rownum.Groups [0] .Value가 필요합니다. 그럼에도 불구하고 좋은 설명이 있기 때문에 +1이된다. – executor