将整数转换为字符数组

3
static void Main(string[] args)
{
    int num = 382;
    int output = 0;
    char[] nlst = num.ToString().ToCharArray();
    for (int i = 0; i < nlst.Length; i++)
    {
        output += nlst[i];
    }
    Console.WriteLine(output);
    Console.ReadLine();
}

输出结果为157,实际应该是13。通过调试我发现char[] nlst的三个元素如下:
[0]51'3',[1]56'8',[2]50'2'
为什么?51、56、50代表什么意思?

2
Unicode代码点?你到底想要实现什么? - Frédéric Hamidi
2
51, 56, 50 是分别代表数字 3、8 和 2 的 ASCII 码。您可以将字符串拆分为单个字符。 - BWA
1
@BWA,ASCII 已经过时了... - Frédéric Hamidi
1
@FrédéricHamidi 是的,但仍然有效;-)基本Unicode代码映射到ASCII;-) - BWA
7个回答

12
您假定 '0' 的字符值是0,但事实并非如此;它实际上是'0'的UTF16值,即48。

因此,您正在将字符'3''8''2'的UTF16值相加,即51、56和50。

请注意,如果您的目标是将整数的所有数字相加,请完全避免转换为字符串,例如:

int num = 382;

// Compute the sum of digits of num

int total = 0;

while (num > 0)
{
    total += num%10;
    num /= 10;
}

Console.WriteLine(total);

然而,如果你只想知道如何让你的版本工作,只需在将代码相加之前从每个字符中减去'0'。这将把'0'转换为0,'1'转换为1等:

for (int i = 0; i < nlst.Length; i++)
{
    output += nlst[i] - '0'; // Subtract '0' here.
}

2

这些分别是数字'3'、'8'和'2'的Unicode值。

要将Unicode值(例如51)转换为该值所代表的字符的整数表示形式(例如3),请使用Convert.ToInt32(char)方法。


0

[编辑] Char是Unicode 16 (https://msdn.microsoft.com/zh-cn/library/x9h8tsay.aspx)。您可以使用int.Parse。

static void Main(string[] args)
{
    int num = 382;
    int output = 0;
    char[] nlst = num.ToString().ToCharArray();
    for (int i = 0; i < nlst.Length; i++)
    {
        output += int.Parse(nlst[i].ToString());

    }
    Console.WriteLine(output);
    Console.ReadLine();
}

0

这些数字是数字的字符编码。如果你只想把每个数字的值加起来,你可以从每个字符的值中减去48来转换为它的数字值。

for (int i = 0; i < nlst.Length; i++)
{
    output += nlst[i] - 48;
}

0

你的输出变量被定义为整数。如果你将一个字符(char)添加到一个整数上(+=),那么它的 Unicode 值将会被添加到输出变量中。

    static void Main(string[] args)
{
    int num = 382;
    int output = 0;
    char[] nlst = num.ToString().ToCharArray();
    for (int i = 0; i < nlst.Length; i++)
    {
        output += Convert.ToInt32(nlst[i]);

    }
    Console.WriteLine(output);
    Console.ReadLine();
}

0
你需要将 char 转换回其数字值。
试试这个:
output += Convert.ToInt32(Char.GetNumericValue(nlst[i]));

0

正确的解决方案是

output += Convert.ToInt32(nlst[i]) - '0';

或简要地说

output += nlst[i] - '0';

或者,作为另一种选择

output += Convert.ToInt32(Convert.ToString(nlst[i]));

请注意:除了C++之外,C# Convert.ToInt32还将字符转换为基本的Unicode(即旧的Ascii)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接