2012-02-10 22 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」的代碼,而不是數字零。 (以數字1和符號'1'等等。) – 2012-02-10 09:32:44

回答

4

使用一個簡單的regex是什麼?

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#',並在python中寫下我的原始答案。方便的實際正則表達式模式所需的語法在python和c#中都是相同的。

+0

我不明白... – samuraisxmali 2012-02-10 09:52:34

+0

你不明白什麼? – Benedict 2012-02-10 10:42:37

+0

也許,因爲這個問題被標記爲c# – 2012-02-10 11:28:21

1

在你的第一個例子中,條件if ((b > 0) && (b < 9))永遠是假的,因爲b在零開始了,並且永遠不會改變。

+0

它不起作用。我改變了:int b = 1; (b> = 0)&&(b <9));(當b = 0時),但沒有任何變化... – samuraisxmali 2012-02-10 09:28:07

+0

'b'無論如何都是錯誤的檢查 - 我認爲其他答案現在解釋這個並提供一個工作解決方案。 – DNA 2012-02-10 09:29:59

4

使用您目前的方法,您需要將每個字符a從字符代碼轉換爲相應的整數。使用Int32.Parse()。在您嘗試使用(char)b強制轉換的一次嘗試中,所有這一切都是爲了給角色代碼b

這將是更容易寫這樣

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

這裏測試我使用的語法文字,'0'而不是"0"這是一個字符串的字符。

+0

我想只計算0,1,2,3,4,5,6,7,8和9,只不過是諸如21,34,56,234等...... – samuraisxmali 2012-02-10 09:54:25

+0

您的代碼示例未指示那。你需要一個更復雜的算法來解決這個問題。 – 2012-02-10 09:55:55

+0

因爲這個我試圖使用int [] k,但是... 你能幫助並給出任何代碼嗎?謝謝你的回答。 – samuraisxmali 2012-02-10 10:06:58

0

有點難以分辨您的代碼是如何排序的,但在第一個塊中,您將b設置爲0並且永不改變它。

這意味着((b > 0) && (b < 9))將始終是錯誤的。

我想你應該檢查a而不是b

你也罷工了字符'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 2012-02-10 09:27:40

+0

還有一件事,它計數從0到9的字符,所以當我寫數字32或其他超過9的其他東西時,它也計數... – samuraisxmali 2012-02-10 09:36:05

+0

你想計數你的字符串中的數字字符或計數數字如234或78235?如果你想計算數字,你應該使用正則表達式。 – shift66 2012-02-10 09:37:38

6

使用string.count的例子:

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

+0

+1我想知道什麼時候有人會建議檢查unicode類別! – MattDavey 2012-02-10 09:31:13

+3

因爲這是一個家庭作業問題,我認爲解決方案值得多一點解釋。這裏Count()方法作爲IEnumerable單個字符序列的字符串。 'Char.IsDigit'方法是一個謂詞,它可以有效地過濾掉任何不是數字的字符,只剩下一個數字字符。值得注意的是,我們正在使用LINQ和Char類型,而不是直接使用System.String。 – MattDavey 2012-02-10 09:33:45

+0

非常感謝你解釋這個方法,但是我想這樣做:只計算0,1,2,3,4,5,6,7,8和9,不計其數,比如21,34,56,234等等在...和你的情況下,它也計算另一個數字... – samuraisxmali 2012-02-10 09:46:43

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

此代碼無法返回答案20,因爲它只循環10次。它計算字符串中有多少_different_ digits,而不是字符串中有多少_total_ digits。 – DNA 2012-02-10 14:24:58

0

我就遇到了這個問題,LINQ不可用。然而,將LINQ解決方案的基本思想移植到其上很容易。以下是nonLINQ解決方案:

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