1

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

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]);

有人可以解释一下有什么问题吗?以及如何纠正这个问题

4

5 回答 5

2

50 是'2'. 你需要的是'2' - '0'(50-48)

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

http://www.asciitable.com/

于 2014-02-17T15:49:19.397 回答
2

你得到的是字符的 ascii 值2,你可以ToString在字符项上使用 call 然后调用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

于 2014-02-17T15:52:00.217 回答
0

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

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

或者

curDigit = Convert.ToUInt32(data[i] - 48);
于 2014-02-17T15:51:12.503 回答
0

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

  1. Better curDigit = Convert.ToUInt32(data[i] - '0'); //从 char 中减去 '0' 的 ASCII 表示
  2. curDigit = Convert.ToUInt32(data.Substring(i,1));//使用子字符串返回一个字符串而不是char。请注意,此方法效率较低,因为从字符串转换本质上是将字符串拆分为字符,并从每个字符中减去“0”。
于 2014-02-17T15:55:18.383 回答
0

UInt32.TryParse您可以将其用作替代解决方案,而不是搞乱 ASCII 计算。但是,此方法需要string输入 not 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
}
于 2014-02-17T15:59:55.990 回答