2016-06-01 74 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;