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);
}
我不清楚你为什么要这样做;只需在你的整数上调用 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。
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);
}