C# 将字符数字转换为int时的值不正确

C# 将字符数字转换为int时的值不正确,c#,C#,我的最终目标是取一个像29这样的数字,把它分开,然后把得到的两个整数相加。例如,如果数字是29,答案是2+9=11 在调试时,我可以看到这些值被保留,但是在本例中,其他值似乎也不正确。所以,我的答案是107。我不知道这些值是从哪里来的,我也不知道从哪里开始修复它 我的代码是: class Program { static void Main(string[] args) { int a = 29; int answer = addTwoDigits

我的最终目标是取一个像29这样的数字,把它分开,然后把得到的两个整数相加。例如,如果数字是29,答案是2+9=11

在调试时,我可以看到这些值被保留,但是在本例中,其他值似乎也不正确。所以,我的答案是107。我不知道这些值是从哪里来的,我也不知道从哪里开始修复它

我的代码是:

class Program
{
    static void Main(string[] args)
    {
        int a = 29;
        int answer = addTwoDigits(a);
        Console.ReadLine();


    }
        public static int addTwoDigits(int n)
        {
            string number = n.ToString();
            char[] a = number.ToCharArray();
            int total = 0;

            for (int i = 0; i < a.Length; i++)
            {
                total = total + a[i];
            }
            return total;
        }

}
类程序
{
静态void Main(字符串[]参数)
{
INTA=29;
int answer=加两位数(a);
Console.ReadLine();
}
公共静态int addTwoDigits(int n)
{
字符串编号=n.ToString();
char[]a=number.ToCharArray();
int-total=0;
for(int i=0;i
您的代码实际上是在添加字符的十进制值。
看看

2和9的十进制值分别为50和57。在进行加法之前,需要将字符转换为int

int val = (int)Char.GetNumericValue(a[i]);

您的代码实际上是在添加字符的十进制值。
看看

2和9的十进制值分别为50和57。在进行加法之前,需要将字符转换为int

int val = (int)Char.GetNumericValue(a[i]);

您的问题是您正在添加
char
值。请记住,字符是一个整数值,表示ASCII中的字符。当您将
a[i]
添加到
total
值时,您将添加表示该
char
int
值,编译器将自动对其进行强制转换

此代码行中存在问题:

total = total + a[i];
total += (int)a[i];

// If a[i] = '2', the character value of the ASCII table is 50.
// Then, (int)a[i] = 50.
上述代码等于此代码行:

total = total + a[i];
total += (int)a[i];

// If a[i] = '2', the character value of the ASCII table is 50.
// Then, (int)a[i] = 50.
要解决您的问题,您必须通过以下方式更改该行:

total = (int)Char.GetNumericValue(a[i]);

// If a[i] = '2'.
// Then, (int)Char.GetNumericValue(int)a[i] = 2.
您可以通过此查看如何转换数值 从
char
int

在这里,您可以看到ASCII值表


您的问题是您正在添加
char
值。请记住,字符是一个整数值,表示ASCII中的字符。当您将
a[i]
添加到
total
值时,您将添加表示该
char
int
值,编译器将自动对其进行强制转换

此代码行中存在问题:

total = total + a[i];
total += (int)a[i];

// If a[i] = '2', the character value of the ASCII table is 50.
// Then, (int)a[i] = 50.
上述代码等于此代码行:

total = total + a[i];
total += (int)a[i];

// If a[i] = '2', the character value of the ASCII table is 50.
// Then, (int)a[i] = 50.
要解决您的问题,您必须通过以下方式更改该行:

total = (int)Char.GetNumericValue(a[i]);

// If a[i] = '2'.
// Then, (int)Char.GetNumericValue(int)a[i] = 2.
您可以通过此查看如何转换数值 从
char
int

在这里,您可以看到ASCII值表


只是为了好玩,我想看看我是否可以使用LINQ在一行中完成它,现在是:

public static int AddWithLinq(int n)
{
    return n.ToString().Aggregate(0, (total, c) => total + int.Parse(c.ToString()));
}

我不认为它会是特别“干净”的代码,但它可能是最好的教育

只是为了好玩,我想看看我是否可以用LINQ在一行中完成这项工作,结果如下:

public static int AddWithLinq(int n)
{
    return n.ToString().Aggregate(0, (total, c) => total + int.Parse(c.ToString()));
}
我不认为它会是特别“干净”的代码,但它可能是最好的教育

试试这个:

public static int addTwoDigits(int n)
    {
        string number = n.ToString();
        char[] a = number.ToCharArray();
        int total = 0;

        for (int i = 0; i < a.Length; i++)
        {
            total = total + (int)Char.GetNumericValue(a[i]);
        }
        return total;
    }
publicstaticintaddtwodights(intn)
{
字符串编号=n.ToString();
char[]a=number.ToCharArray();
int-total=0;
for(int i=0;i
转换为字符的数字始终返回ASCII码。。因此,您可以使用GetNumericValue()方法来获取值,而不是使用ASCII码

public static int addTwoDigits(int n)
    {
        string number = n.ToString();
        char[] a = number.ToCharArray();
        int total = 0;

        for (int i = 0; i < a.Length; i++)
        {
            total = total + (int)Char.GetNumericValue(a[i]);
        }
        return total;
    }
publicstaticintaddtwodights(intn)
{
字符串编号=n.ToString();
char[]a=number.ToCharArray();
int-total=0;
for(int i=0;i

转换为字符的数字始终返回ASCII码。。因此,您可以使用GetNumericValue()方法来获取值,而不是前面提到的ASCII码。代码的问题是,当您强制转换到
int
时,字符有一个ASCII码值,该值与各种数字不匹配。不要乱搞字符串和字符,只需使用好的旧数学即可

public static int AddDigits(int n)
{
    int total = 0;
    while(n>0)
    {
        total += n % 10;
        n /= 10;
    }

    return total;
}

模乘10将产生最低有效位,因为整数除法会截断最低有效位,当数字用完时,最终会变成0。

如前所述,代码的问题是,当您转换为
int
时,字符有一个ASCII码值,而这个值不存在与各种数字匹配。不要乱搞字符串和字符,只需使用好的旧数学即可

public static int AddDigits(int n)
{
    int total = 0;
    while(n>0)
    {
        total += n % 10;
        n /= 10;
    }

    return total;
}

模乘10将产生最低有效位,因为整数除法截断
n/=10
将截断最低有效位,并在数字用尽时最终变为0。

您应该使用int.TryParse

  int num; 
 if (int.TryParse(a[i].ToString(), out num))
  {
      total += num; 
   }

你应该把你的屁股弄脏

  int num; 
 if (int.TryParse(a[i].ToString(), out num))
  {
      total += num; 
   }
publicstaticintaddtwodights(intn)
{
字符串编号=n.ToString()
char[]a=number.ToCharArray();
int-total=0;
for(int i=0;i
公共静态int addTwoDigits(int n)
{
字符串编号=n.ToString()
char[]a=number.ToCharArray();
int-total=0;
for(int i=0;i
您不需要将数字转换为字符串来查找数字@juharr已经解释了如何在循环中计算数字和总数。以下是递归版本:

int addDigit(int total,int n)
{
    return (n<10) ? total + n
                  : addDigit(total += n % 10,n /= 10);
}
addDigits(234233433)
也返回27

如果数字已经是一个字符串,可以利用字符串可以被视为Char-arra这一事实