3

将值“01200000131”传递给此方法:

private static int sumOddVals(string barcode)
{
    int cumulativeVal = 0;
    for (int i = 0; i < barcode.Length; i++)
    {
        if (i % 2 != 0)
        {
            MessageBox.Show(string.Format("i is {0}; barcode{0} is {1}", i, barcode[i]));
            cumulativeVal += Convert.ToInt16(barcode[i]);
        }
    }
    MessageBox.Show(string.Format("Odd total is {0}", cumulativeVal));
    return cumulativeVal;
}

...返回“244”

我期待它返回“4”。

第一个消息框显示了我希望看到的内容,即“1”,然后是“0”三次,然后是“3”,我希望加起来是“4”,而不是“244”。

4

2 回答 2

10

您在此处将数值转换charint':

 cumulativeVal += Convert.ToInt16(barcode[i]); // Indexer on a string is a char

你想要的..是将该数字的字符串表示形式转换为数字..而不是char值..所以添加ToString()

 cumulativeVal += Convert.ToInt16(barcode[i].ToString());

编辑:

或者,正如评论中指出的那样:

 cumulativeVal += Convert.ToInt16(barcode[i] - '0');

结果:4。

于 2013-09-03T23:59:40.877 回答
1

这一行:

    Convert.ToInt16(barcode[i])

char值 ( barcode[i]) 转换为shortint但是字符值在调用之前被隐式转换为 an ToInt16(),因此它有效地将字符代码转换为其等效整数,即转换为自身。因此'0'转换为 48。

你想要的是这样的:

    (barcode[i] - '0')

它适用于所有十进制数字字符('0'通过'9')。

警告

如果barcode[i]不是十进制数字字符,你会得到奇怪的结果。(无论如何,您的代码都应该对此进行检查。)

于 2013-09-04T00:13:09.957 回答