C# 如何在不使用其他类库的情况下编写toString方法
我想写我自己的toString方法,因为我不允许使用任何类库 所以我研究了toString方法的源代码,但是它使用了很多其他库。我想把一个整数转换成一个字符串,但我不确定如何逐个处理这些数字 如果我能做到这一点,我可以继续将整数转换成一个字符,最后将所有字符相加成一个字符串C# 如何在不使用其他类库的情况下编写toString方法,c#,C#,我想写我自己的toString方法,因为我不允许使用任何类库 所以我研究了toString方法的源代码,但是它使用了很多其他库。我想把一个整数转换成一个字符串,但我不确定如何逐个处理这些数字 如果我能做到这一点,我可以继续将整数转换成一个字符,最后将所有字符相加成一个字符串 有人能帮忙吗?我不明白为什么不允许你使用任何库。但是如果你需要完全用手进行转换,你可以这样做 private static string IntToString(int i) { string[] digits =
有人能帮忙吗?我不明白为什么不允许你使用任何库。但是如果你需要完全用手进行转换,你可以这样做
private static string IntToString(int i)
{
string[] digits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
string sign = (i < 0 ? "-" : "");
var absI = (i < 0 ? -i : i);
string result = "";
while (absI != 0)
{
int digit = absI % 10;
result = digits[digit] + result;
absI = (absI - digit) / 10;
}
return sign + result;
}
私有静态字符串IntToString(inti)
{
字符串[]位={“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”};
字符串符号=(i<0?-“:”);
var absI=(i<0?-i:i);
字符串结果=”;
while(absI!=0)
{
整数位数=absI%10;
结果=位数[位数]+结果;
absI=(absI-数字)/10;
}
返回符号+结果;
}
上面的代码对于零来说不能正常工作。如果您需要,添加非常简单。例如,您可以将数字拆分为单个字符:
// Note that this is just for example and for positive numbers only.
IEnumerable<char> ToChar(int num)
{
while (num > 0)
{
// adding '0' to number will return char for that number
char ch = (char)(num % 10 + '0');
num /= 10;
yield return ch;
}
}
使用方法:
int i = 554;
string str = ToString(i);
参考资料:以下是与其他答案类似的方法 要点:
lastDigital=number%10;
)时找到它的余数来计算数字的最后一个数字-
符号;然后,对数字求反,使其为正。但是,请注意,不能否定int.MinValue
,因此必须特别处理'0'
并将结果转换回字符
,您可以将其从数字数字转换为等价的字符
public static string MyToString(int number)
{
if (number == int.MinValue)
return "-2147483648"; // Special case.
char[] digits = new char[64]; // Support at most 64 digits.
int last = digits.Length;
bool isNegative = number < 0;
if (isNegative)
number = -number;
do
{
digits[--last] = (char) ('0' + number % 10);
number /= 10;
}
while (number != 0);
if (isNegative)
digits[--last] = '-';
return new string(digits, last, digits.Length-last);
}
公共静态字符串MyToString(整数)
{
if(number==int.MinValue)
return“-2147483648”;//特殊情况。
char[]digits=新字符[64];//最多支持64位。
int last=位数。长度;
bool为负=数值<0;
如果(为负)
数字=-数字;
做
{
数字[--last]=(字符)(“0”+数字%10);
数目/=10;
}
while(number!=0);
如果(为负)
数字[--last]='-';
返回新字符串(数字、最后一个、数字、最后一个长度);
}
我想你问的主要部分是如何一个接一个地获取数字的数字,上面的do/while
循环回答了这个问题
[编辑]解决了下面评论中提出的问题。您能显示输入吗?您确定需要创建自己的ToString方法吗?可能需求只是“不要使用第三方库”,而不是使用
系统库(其中包含大多数基本有用的内容,包括int.ToString()
),因为代码无论如何都会隐式引用它,所以不清楚约束的目的是什么。这是一个明确要求你重新发明轮子的家庭作业吗?我和杰罗恩在一起。如果不允许您使用(任何)libs,.net不适合您。几乎任何高级语言都不适合你。这真的没有道理。这肯定是一个家庭作业问题?不错,但对于int.MinValue
(以相当有趣的方式--“0123456789”[number%10]
失败得更明显)。此外,您可以立即反向存储数字,并取字符串的结尾,而不是开头,尽管我同意这不是练习的核心。@Jeroenmoster啊,是的,您不能否定int.MinValue。我想如果需要的话,你可以特别处理。从末尾开始存储数字的好主意。“我会更新的。”马修沃森非常感谢你,马修!我的问题是,我不明白如何处理一个数字的最后一个数字(数字一个接一个==数字一个接一个,我的坏…),我会以技术理由取消这个解决方案的资格。即使我们允许迭代器和IEnumerable
作为语言的一部分,Enumerable.Reverse()
和Enumerable.ToArray()
都是库调用(生活在System.Linq
中)。否则,我们可能会有更多的LINQ骗局(.Range
,.Select
,.Join
)。@jeroenmoster这并不是一个复制粘贴的解决方案,而是对OP问题的“帮助”或“指导”。
public static string MyToString(int number)
{
if (number == int.MinValue)
return "-2147483648"; // Special case.
char[] digits = new char[64]; // Support at most 64 digits.
int last = digits.Length;
bool isNegative = number < 0;
if (isNegative)
number = -number;
do
{
digits[--last] = (char) ('0' + number % 10);
number /= 10;
}
while (number != 0);
if (isNegative)
digits[--last] = '-';
return new string(digits, last, digits.Length-last);
}