如何将数字格式化为带有前导零的字符串?

336

我有一个数字需要转换为字符串。首先我使用了这个:

Key = i.ToString();

但我发现它的排序很奇怪,所以我需要用零填充它。 我该怎么做?


9
可能是C#将整数转换为带填充零的字符串?的重复问题。 - nawfal
11个回答

450
相当简单:
Key = i.ToString("D2");

D代表"十进制数",2代表要打印的数字位数。


8
如果您使用 string.Format("D2", value),输出结果将是 D2,但这行代码并不能起作用。在这种情况下我们必须使用 "{0:00}" - v.oddou
58
你应该使用string.Format("{0:D2}", value)。仅使用string.Format("D2", ...)是不会替换任何东西的,因为你没有占位符。 - infinitypanda
8
请注意,这只适用于 value 是整数的情况。如果 value 是双精度数,就需要使用 string.Format("{0:00}", value) - derekantrican
如果我们谈论“前导数字”,我认为答案将是i.ToString(“00”);其中“00”代表前导零...您可以尽可能增加此数量。 - Dedan
如果数字是小数,则会出现System.FormatException错误。最好使用.ToString("N0").PadLeft(2, '0')。但是,PadLeft在负数(负号前面的零)上无法正常工作。 - Codingwiz

276

8
请注意,String.Format("{0:00000}", "15"); 返回的是 "15",即它不能用于字符串。 - Paul McCarthy
7
更简洁的方法是:$"{15:D5}"; 的输出结果为:"00015"。 - Al Dass
3
如果你有一个 int i 并且想要8位数字,只需要使用 var iStr = $"{i:D8} - Matt

90
如果您想保持固定宽度,例如10个数字,请按以下方式进行。
Key = i.ToString("0000000000");

替换为您想要的任意数字。

i = 123 将导致 Key = "0000000123"


78

鉴于还没有人提到这一点,如果您使用的是C# 6或更高版本(即Visual Studio 2015),则可以使用字符串插值来简化代码。因此,您可以像这样而不是使用string.Format(...)

Key = $"{i:D2}";

39

使用:

i.ToString("D10")

请查看Int32.ToString(MSDN)和标准数字格式字符串(MSDN)。

或者使用String.PadLeft。例如:

int i = 321;
Key = i.ToString().PadLeft(10, '0');

这将导致0000000321的结果。但是 String.PadLeft 不能用于负数。

请参见 String.PadLeft (MSDN)。


5
我猜当你试图在负数上使用它时,它会出现问题。 - Mario
谢谢 - 我用了第二个。我省略了 ".ToString()" - 它仍然有效。 - SunsetQuest

26

对于插值字符串:

$"Int value: {someInt:D4} or {someInt:0000}. Float: {someFloat: 00.00}"

这基本上和我3年前发布的答案是一样的。 - DavidG
@DavidG 我怀疑可能是问题和回答被合并了一下。保罗在你之前五年就已经发表了基本相同的答案。 - undefined
保罗在2019年编辑了他们的问题,包括更新的信息。我在2016年添加了我的答案。 - undefined
@DavidG 我觉得有点疯狂,我在StackOverflow上有个来自世界另一边的人指责我发布了一些内置语法,说我在某种程度上盗用了荣誉。 - undefined

15

通常而言,String.Format("format", object) 比 object.ToString("format") 更可取。因此,

String.Format("{0:00000}", 15);  

更可取的是,

Key = i.ToString("000000");

5
是的,正如@cja所问,为什么这更可取?我并不反对这种说法,我想知道为什么。 - Christopher King
第一种语法“感觉”更加精确、可预测和清晰。最好将其表述为Key = String.Format("{0:00000}", 15);与Key = i.ToString("000000");进行比较。使用第一种语法,我非常确定我会得到什么结果,如果偶然错了一个字符,我也知道该改变什么(格式字符串)。因此,简而言之,对我来说,出于情感个人偏好,这是更可取的,虽然只有一个几乎合理的半理由支持它;-) 那么就这样决定了? - Developer63

15

尝试:

Key = i.ToString("000000");

个人而言,我建议你尝试直接按整数排序,而不是按字符串表示排序。


4
int num=1;
string number=num.ToString().PadLeft(4, '0')

输出="00001"

编辑: 更改以匹配PadLeft数量


3

我希望在这里我的数字限制为四位,例如如果是1,则应显示为0001,如果是11,则应显示为0011。以下是代码。

        reciptno=1;//Pass only integer.

        string formatted = string.Format("{0:0000}", reciptno);

        TxtRecNo.Text = formatted;//Output=0001..

我实现了这段代码来生成收据编号。

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