2012-02-10 3 views
2

0에서 9까지의 숫자가 문자열에 몇 개나 있는지 계산하려고합니다. 일부 코드를 시도했지만 작동하지 않으면 매번 0을 반환합니다. 뭐가 잘못 됐어? 또한 u는 srting.Count() 메서드로 어떻게하는지 알려줄 수 있습니다. 감사. b 제로에서 밖으로 시작하고 수정되지 않습니다 때문에 첫 번째 예에서문자열의 카운트 숫자 (0에서 9까지)

// Attempt 1 
string str = textBox1.Text; 
int b = 0; 
int n = 0; 
foreach (char a in str) 
{ 
    if ((b > 0) && (b < 9)) 
    { 
     if ((char)b == a) 
      n++; 
    } 
} 
label1.Text = n; 

// Attempt 2 
string str = textBox1.Text; 
int n = 0; 
foreach (char a in str) 
{ 
    int[] k = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    foreach (int b in k) 
    { 
     if (b == a) 
      n += 1; 
    } 
} 
label1.Text = n 
+1

주요 개념 : 여기 nonLINQ 솔루션입니다. 문자열에는 숫자 0이 아닌 문자 기호 '0'에 대한 코드가 포함됩니다. (숫자 1과 기호 '1'로 표시됩니다.) –

답변

4

사용을위한 간단한 정규식?

var matches = System.Text.RegularExpressions.Regex.Matches("1 2 3 4 5 6 10 11 12", "(?<![0-9])[0-9](?![0-9])"); 
    Console.WriteLine(matches.Count); 

출력 6. 이렇게하면 두 자리 이상의 숫자가 아닌 격리 된 숫자 만 선택됩니다.

편집 : 어떻게 든 완전히 'C#'이라는 질문 태그를 놓치고 파이썬으로 원래의 답변을 작성했습니다. 편리하게 필요한 실제 정규식 패턴 구문은 파이썬과 C#에서 모두 동일합니다.

+0

나는 이해하지 못합니다 ... – samuraisxmali

+0

당신은 무엇을 이해하지 못합니까? – Benedict

+0

어쩌면, 질문은 C# –

1

는 조건 if ((b > 0) && (b < 9))은 항상 false입니다.

+0

작동하지 않습니다. 내가 변경 : 정수 b = 1; 그리고 ((b = 0) && (b <9)); (b = 0 일 때)하지만 아무 것도 바뀌지 않는다 ... – samuraisxmali

+0

'b'는 어쨌든 검사 할 잘못이다. 이제 이것을 설명하고 실제 해결책을 제시하십시오. – DNA

4

현재 접근 방식을 사용하면 문자 코드에서 각 문자 a을 해당 정수로 변환해야합니다. Int32.Parse()을 사용하십시오. 귀하의 시도 중 하나에서 (char)b 캐스트를 사용했지만이 모든 것은 문자 코드 b이있는 문자를 제공하는 것입니다.

내가 문자열 리터럴 "0"에 반대 '0', 리터럴 문자의 구문을 사용하고 여기에이

foreach (char a in str) 
    if ((a>='0') && (a<='9')) 
     .... 

같은 테스트를 작성하는 것이 더 쉽습니다.

+0

나는 0, 1, 2, 3, 4, 5, 6, 7, 8 및 9만을 더 계산하고 싶다. 21,34,56,234 등등 ... – samuraisxmali

+0

코드 샘플은 표시하지 않았다. 그. 이 문제를 해결하려면 더 복잡한 알고리즘이 필요합니다. –

+0

이 때문에 int [] k를 사용하려고했지만 ... 코드를 작성하고 제공 할 수 있습니까? 어쨌든 대답 주셔서 감사합니다. – samuraisxmali

0

코드의 순서를 지정하는 데 어려움이 있지만 처음 블록에서 b을 0으로 설정하고 절대로 변경하지 마십시오.

즉, ((b > 0) && (b < 9))은 항상 false입니다.

아마 b이 아닌 a을 확인해야한다고 생각합니다.

또한 문자'0'정수0과 동일하지 않습니다 문제를 공격 할 수 있습니다.

4
int n=0; 
foreach (char a in str) 
{ 
    if (a >= '0' && a <= '9') 
      n++; 
} 

그냥 사용하십시오.
설명 : ASCII 문자 0 코드 48 문자 9가 57 (here 모든 문자 코드를 찾을 수 있습니다) 및 C#에서 문자를 비교할 때 그들의의 코드를 비교합니다.
if (a >= 48 && a <= 57))을 쓸 수도 있으며 효과가 있습니다. 희망이 도움이되었습니다.
편집 : 귀하의 의견을 읽었습니다.

for(int = 1; i < str.length-1; i++) 
{ 
    if(Char.IsDigit(str[i])) && 
     !Char.IsDigit(str[i-1]) && 
     !Char.IsDigit(str[i+1])) 
     n++; 
} 

그 다음에 첫 번째와 마지막 문자를 확인해야합니다. 그게 다야.

+2

보통 숙제에 대한 코드 솔루션을 제공하는 좋은 양식으로 간주되지 않습니다. 우리는 이미 업계에서 위트없는 광대를 충분히 가지고 있습니다 :-) – paxdiablo

+0

한 가지 더, 그것은 0에서 9까지의 문자를 계산합니다. 그래서 숫자 32를 쓰거나 9보다 더 많은 것을 쓰면 그것을 계산합니다 ... – samuraisxmali

+0

당신이 계산하고 싶습니까? 문자열의 디지털 문자 또는 234 또는 78235와 같은 카운트 번호? 숫자를 계산하려면 정규 표현식을 사용해야합니다. – shift66

6

string.count 사용하는 예 :

int result = "1 2 2 5 2 4".Count(char.IsDigit);

+0

+1 누군가가 유니 코드 카테고리를 검사 할 것을 제안하려고했을 때 궁금합니다. – MattDavey

+3

이것이 숙제 문제이므로 솔루션에 대한 설명이 좀 필요하다고 생각합니다. Count() 메서드는 문자열에 IEnumerable 개별 문자 시퀀스로 작동합니다. 'Char.IsDigit'메서드는 숫자가 아닌 모든 문자를 효과적으로 필터링하는 술어입니다.이 문자는 숫자 인 문자의 수가 남아 있습니다. LINQ 및 Char 유형을 여기에서 사용하고 System.String을 직접 사용하지는 않습니다. – MattDavey

+0

그 방법을 설명해 주셔서 대단히 감사합니다. 그러나 나는 이것을 원했습니다 : 단지 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 그리고 더 이상은 21, 34, 56, 에 ... 그리고 당신의 경우에, 그것은 다른 숫자를 역시 계산합니다 ... – samuraisxmali

2

이것은 당신에게 내가이 문제에 실행

public int CountDigits(string text) 
{ 
    return text.Cast<int>().Count(c => c >= 48 && c <= 57); 
} 
0
string str = "429gfsj58347583jhfs094248324"; 

    for(j=0;j<=9;j++) 
    { 
    if (str.Contains(j.ToString())) 
    { 
     n++; 
    } 
    } 

Response.Write(n.ToString()); 


Will return the numbers frequency 
Answer: 20 

If you want the count separatly please ask freely. 

Regards, 

Madan Tiwari 
+1

이 코드는 루프 10 회만 돌아 가기 때문에 응답 20을 반환 할 수 없습니다. 문자열에 _different_ 자릿수가 몇 개 있는지를 계산하며 문자열에 _total_ 자릿수가 몇 개인 지 계산하지 않습니다. – DNA

0

을 도움이 될 것입니다 및 LINQ는 사용할 수 없습니다. 그러나 LINQ 솔루션의 기본 아이디어로 이식하기는 쉽습니다. 당신은 숫자 0은 우리가 그 숫자를 표현하는 데 사용하는 심볼`0`에서 완전히 다른 일이 있다는 것입니다 누락

int formatLength = 0; 
foreach(char maybeDigit in format) { 
      //use a ternary expression since C# can't cast bool to int 
      formatLength += Char.IsDigit(maybeDigit) ? 1 : 0; 
} 
관련 문제