在C#中,如何对整数进行零填充格式化而不使负值变长?

3
我正在使用C# .Net 5.0和Visual Studio开发。我正在将整数格式化为带有零填充,如下所示:
$"{-1:d04}"
$"{1:d04}"

正数和负数的格式化会导致结果字符串长度不同

-0001
0001

我需要我的数字具有相同的长度(例如,此示例中的结果应为字符串"-001""0001"),是否存在任何格式化模式可实现此目的?


我不想显示这些值,我是通过这种技术来对字符串进行排序的。我通过在前面添加固定长度的值来格式化不同参数的字符串。然后在打印字符串时,我会切掉参数。 - Rob Hoff
我只需要根据很多参数对字符串进行排序,并且我只需要一次结果(即,代码质量不重要)。只要所有的参数都是正数,它就表现得非常好。 - Rob Hoff
我明白了,所以实际格式并不重要,只要它们的长度相同就可以了?请看我的编辑。 - Sweeper
1
你需要检查比较是否适用于负数 - 如果你执行简单的字符串比较,很难看出为什么 "1" < "2" 但 "-1" > "-2"(这两个都是你想要的)。 - Jon Skeet
@Jon Skeet 的观点非常好,但对于我的应用程序,我实际上对排序不完美是容忍的!对我来说,重要的是相同的数字彼此相邻。然而,使用不同长度的整数是不可接受的,因为它会切掉字符。 - Rob Hoff
显示剩余3条评论
1个回答

6

一种方法是使用; 格式指定符,为非负数和负数提供两个格式。

int x = 1;
Console.WriteLine($"{x:0000;-000}"); // "0001"
x = -1;
Console.WriteLine($"{x:0000;-000}"); // "-001"

对于正数,使用0000,对于负数,使用-000

这意味着您不再使用标准格式说明符D,该说明符自动使用当前NumberFormatInfo中的NegativeSign。 您必须在代码中硬编码负号。 这可能是一个问题,也可能不是,具体取决于您正在做什么。

编辑:

显然,这是用于对字符串进行排序。 如果格式不一定要完全为“0001”和“-001”,而只需要相同长度,则我建议使用:

int x = 1;
Console.WriteLine($"{x,5:d04}"); // " 0001" (note the leading space)
x = -1;
Console.WriteLine($"{x,5:d04}"); // "-0001"

非常感谢您的编辑,是的,这样更好。我也想到了另一种方法,即通过添加偏移量将它们从负范围中取出! - Rob Hoff

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