我需要遍历字符串,该字符串应该是数字字符串并对这些数字进行一些算术运算
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]);
有人可以解释一下我出了什么问题吗?以及如何解决问题
答案 0 :(得分:2)
50是'2'
的ascii代码。你需要的是'2' - '0'
(50-48)
byte[] digits = "4000080706200002".Select(x => (byte)(x - '0')).ToArray();
答案 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。
你可以做两件事来克服这种行为:
curDigit = Convert.ToUInt32(data[i] - '0');
//从char中提取'0'的ASCII表示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
}