C# 中的 itoa 转换

本文关键字:转换 itoa 中的 | 更新日期: 2023-09-27 18:37:01

这是向我提出的一个面试问题 - 在不使用任何内置函数的情况下编写itoa转换。

以下是我正在使用的算法。但是('0' + n % 10);抛出了一个错误:

无法将字符串转换为整数

private static string itoa(int n)
{
    string result = string.Empty;
    char c;
    bool sign = n > 0 ? true : false;
    while (true)
    {
        result = result + ('0' + n % 10);  //'0' 
        n = n / 10;
        if(n <= 0)
        {
            break;
        }               
    }
    if(sign)
    {
        result =  result + '-';
    }
    return  strReverse(result);
}

C# 中的 itoa 转换

我不清楚你为什么要这样做;只需在你的整数上调用 ToString。 您可以使用各种重载指定所需的任何格式。

正如@minitech所评论的,我们通常只使用 ToString() 在 C# 中执行此操作。如果你真的想自己编写算法,下面是一个实现:

public static partial class TestClass {
    public static String itoa(int n, int radix) {
        if(0==n)
            return "0";
        var index=10;
        var buffer=new char[1+index];
        var xlat="0123456789abcdefghijklmnopqrstuvwxyz";
        for(int r=Math.Abs(n), q; r>0; r=q) {
            q=Math.DivRem(r, radix, out r);
            buffer[index-=1]=xlat[r];
        }
        if(n<0) {
            buffer[index-=1]='-';
        }
        return new String(buffer, index, buffer.Length-index);
    }
    public static void TestMethod() {
        Console.WriteLine("{0}", itoa(-0x12345678, 16));
    }
}

它仅适用于int。范围int-2147483648 to 2147483647,字符串表示中的长度最大为11。

因为 C 中

itoa 的签名是char * itoa(int n, char * buffer, int radix);的,但我们不需要在 C# 中传递缓冲区,我们可以在本地分配它。

当基数大于10时,在余数中添加"0"的方法可能不起作用;如果我没记错的话,C 中的itoa最多支持 36 个基数,就像这个实现一样。

('0' + n % 10)会产生一个int值,因此您应该将其转换回char。您的代码还有其他几个问题,例如在错误的一侧添加-符号、使用负值等。

我的版本:

static string itoa(int n)
{
    char[] result = new char[11]; // 11 = "-2147483648".Length
    int index = result.Length;
    bool sign = n < 0;
    do
    {
        int digit = n % 10;
        if(sign)
        {
            digit = -digit;
        }
        result[--index] = (char)('0' + digit);
        n /= 10;
    }
    while(n != 0);
    if(sign)
    {
        result[--index] = '-';
    }
    return new string(result, index, result.Length - index);
}