2012-02-10 11 views
2

0から9までの数字が文字列内にいくつあるかをカウントしたい。いくつかのコードを試しましたが動作しません。毎回0を返します。何が間違っていて、修正する方法は?また、あなたがsrting.Count()メソッドでどうやってそれをするのか教えてくれますか?ありがとう。あなたの最初の例で文字列内のカウント数(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

あなたが欠けている主な概念は、数字0が、その数字を表すために使用する記号「0」とはまったく異なることです。あなたの文字列には、数字の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。これは、2桁以上の数字の一部ではなく、孤立した桁のみをピックアップします。

編集:私は何とか完全に質問タグが 'c#'であることを忘れて、Pythonで私の元の答えを書きました。便利なことに、実際の正規表現パターンの構文は、pythonとc#で同じです。

+0

私は理解していません... – samuraisxmali

+0

あなたは何を理解していますか? – Benedict

+0

質問にはC# –

1

bはゼロでスタートすると変更されることはありませんので、状態if ((b > 0) && (b < 9))は、常にfalseです。

+0

それは動作しません。私は変更:int b = 1;もしも(b = 0)&&(b <9));(b = 0の場合)でも何も変わらない... – samuraisxmali

+0

'b'はとにかくチェックするのが間違っている - 私は他の答えのいくつか今これを説明し、実用的なソリューションを提供します。 – DNA

4

現在のアプローチでは、文字コードから各文字aを対応する整数に変換する必要があります。 Int32.Parse()を使用してください。あなたの試みの1つでは、(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))は常に偽になります。

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

もう1つは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,234などあなたのケースでは、それは他の番号も数えます... – 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_digitがいくつ含まれているかをカウントしています。 – DNA

0

を助けるべきであるとLINQは利用できませんでした。しかし、それをLINQソリューションの基本的なアイデアに移植するのは簡単でした。

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; 
} 
関連する問題