将对应数字的字符转换为uint

时间:2014-02-17 15:46:47

标签: c# string type-conversion converter uint32

我需要遍历字符串,该字符串应该是数字字符串并对这些数字进行一些算术运算

for (int i = data.Length - 1; i >= 0; --i)
  {
       uint curDigit;
       //Convert  to uint the current rightmost digit, if convert fails return false (the valid data should be numeric)
       try
       {
           curDigit = Convert.ToUInt32(data[i]);
           //arithmetic ops...
       }
       catch
       {
         return false;
       }

我用以下输入数据字符串测试它。 “4000080706200002”  对于i = 15,对应最右边的数字2,我将50作为

的输出
curDigit = Convert.ToUInt32(data[i]);

有人可以解释一下我出了什么问题吗?以及如何解决问题

5 个答案:

答案 0 :(得分:2)

50是'2'的ascii代码。你需要的是'2' - '0'(50-48)

byte[] digits = "4000080706200002".Select(x => (byte)(x - '0')).ToArray();

http://www.asciitable.com/

答案 1 :(得分:2)

你得到的是字符2的ascii值,你可以在字符项上使用ToString调用,然后调用Convert.ToUnit32,请考虑以下示例:

char x = '2';
uint curDigit = Convert.ToUInt32(x.ToString());

这会将2作为curDigit

返回给您

对于您的代码,您可以使用:

curDigit = Convert.ToUInt32(data[i].ToString());

另一个选项是使用char.GetNumericValue,如:

uint curDigit = (UInt32) char.GetNumericValue(data[i]);

char.GetNumericValue返回double,您可以将结果转回UInt32

答案 2 :(得分:0)

获取这些字符的ASCII(或Unicode)值。问题是字符'0' ... '9'的代码点不是0 ... 9,而是48 ... 57.要解决此问题,您需要调整该偏移量。例如:

curDigit = Convert.ToUInt32(data[i] - '0');

或者

curDigit = Convert.ToUInt32(data[i] - 48);

答案 3 :(得分:0)

问题是data [i]返回一个char变量,其实质上是一个保存字符ASCII码的整数。所以'2'对应50。 你可以做两件事来克服这种行为:

  1. 更好 curDigit = Convert.ToUInt32(data[i] - '0'); //从char中提取'0'的ASCII表示
  2. curDigit = Convert.ToUInt32(data.Substring(i,1)); //使用substring返回字符串而不是char。请注意,此方法效率较低,因为从字符串转换实际上将字符串拆分为字符,并从每个字符串中减去“0”。

答案 4 :(得分:0)

您可以使用UInt32.TryParse作为替代解决方案,而不是乱用ASCII计算。但是,此方法需要string输入而不是char,因此您必须稍微修改一下方法:

string input = "4000080706200002";

string[] digits = input.Select(x => x.ToString()).ToArray();

foreach(string digit in digits)
{
    uint curDigit = 0;
    if(UInt32.TryParse(digit, out curDigit))
    {
        //arithmetic ops...
    }
    //else failed to parse
}