2016-06-01 109 views
0

我有一個列表框,其中包含從訪問表中獲取的多個汽車的ID號和型號。當從列表框中選擇一輛汽車時,我有一些文本框將填充該表中的數據。要獲得所選汽車的身份證號碼,我用這個代碼:從字符串中獲取字符會返回一個意外的數字嗎?

int idNum = listBox1.SelectedItem.ToString()[0]; 

哪些應該得到的項目字符串的第一個字符(它的ID號)。當我選擇列表中的第一個項目時,我得到的是49.我的第一個想法是我沒有將它轉換爲int,所以也許49代表數字的一些字符代碼,但是

Convert.ToInt16(listBox1.SelectedItem.ToString()[0])

返回完全相同的數字。第二項是50,依此類推。

我想改變我如何從這個字符轉換中得到ID號碼,因爲它只是讓我發現,一旦我打到10輛汽車,它將無法工作,但爲什麼我得到這樣一個大的,一貫抵消,並且(也許最令人費解的是)來自ac#的相當於java的charAt[0]的多位數字?

我一直得到的具體錯誤是there is no row at position 49,當我嘗試獲得mydataset.Tables["mytable"].Rows[idNum]["CarID"].ToString();的值時彈出。現在,我可以看到一些可能導致此問題的事情,我完全知道Rows[idNum]["CarID"]是否是正確的語法,並且非常驚訝地發現我的猜測有效,但這仍然是一個非常奇怪的問題。

回答

1

你需要得到的數值爲Char

int idNum = (int)Char.GetNumericValue(listBox1.SelectedItem.ToString()[0]); 

雖然int idNum = listBox1.SelectedItem.ToString()[0]);回特性'1'(例如),這是49ASCII

這是從Microsoft實際代碼Convert.ToInt16

public static short ToInt16(char value) 
{ 
    // Some validations 
    return (short)value; 
} 

Convert.ToInt16用於char做一個Explicit轉換,這得到ASCIICharacter價值。

處理多個數字:

string str = "37abcdef"; 
string myStrNumber = Regex.Match(str, @"\d+").Value; 

int idNum2; 

if (myStrNumber.Length > 0) 
    idNum2 = Convert.ToInt32(myStrNumber); 
else 
{ 
    // Handle Error 
} 

使用或不使用正則表達式:

string str = "37abcdef"; 
string myStrNumber = ""; 

for(int i = 0; i < str.Length; i++) 
{ 
    if (Char.IsNumber(str[i])) 
     myStrNumber += str[i]; 
} 

int idNum2; 

if (myStrNumber.Length > 0) 
    idNum2 = Convert.ToInt32(myStrNumber); 
else 
{ 
    // Handle Error 
} 
+0

我試過了,它的工作。我結束了使用int idNum =(int)Char.GetNumericValue(listBox1.SelectedItem.ToString()[0]) - 1;',雖然我很困惑,爲什麼這個工作,但'Convert.ToInt16'不。或者,只是將字符的ASCII值轉換爲int /不能轉換任何東西,因爲ASCII值已經是整數? –

+1

@SpaceOstrich我認爲當你使用'Convert'而不是解析 - 'Convert'可能只是在這種情況下進行強制轉換,而一個'Int16.Parse'實際上會解析字符串/ char並返回數值。 – Abbath

+1

@SpaceOstrich檢查編輯的答案,我添加了微軟的實際代碼。 – user3185569

1

試試這個

int idNum = Convert.ToInt16(listBox1.SelectedItem.ToString()[0].ToString()) 

因爲

listBox1.SelectedItem.ToString()[0] return Char。如果將Char類型的數據轉換爲Integer,它將返回Char的ASCII。 因此在轉換爲Integer之前將其轉換爲字符串(listBox1.SelectedItem.ToString()[0])。ToString()

0

user3185569發現了問題,但我會提出解決方案,我最終將使用它作爲將來參考。該int idNum = listBox1.SelectedItem.ToString()[0]);線獲得字符ASCII,49爲1,50爲2等,這可以通過使用(int)Char.GetNumericValue(listBox1.SelectedItem.ToString()[0]) -1;解決。

(int)Char.GetNumericValue獲取該字符的實際數值,而不是ASCII值。 - 1是對從1開始的汽車ID進行解釋,但表索引從0開始。

如果字符串的第一個字符被用於獲取ID號,則仍然會出現數字問題,如一旦有超過9輛汽車,代碼將無法使用。字符串以"[idNum]: [carName]"的形式寫入列表框中。例如:1: Astra。爲了得到身份證號碼,我使用了Split(':')[0],它將字符串拆分爲一個子字符串數組,在每個:字符處進行拆分。

代碼的工作線路:

int idNum = Convert.ToInt16(listBox1.SelectedItem.ToString().Split(':')[0]) - 1;