令人惊讶的int.ToString输出

时间:2014-12-06 21:00:04

标签: c# tostring

我一直致力于一个项目,并发现了一个有趣的问题:

2.ToString("TE"+"000"); // output = TE000
2.ToString("TR"+"000"); // output = TR002

我也尝试过除"TE"之外的几个字符串,但都具有相同的正确输出。

出于好奇,我想知道这怎么可能发生?

4 个答案:

答案 0 :(得分:1)

根据Microsoft的文档Custom Numeric Format Strings,您的字符串“TE000”和“TR000”都是自定义格式字符串,但显然它们的解析方式不同。

2.ToString("TE000")只是格式化程序中的一个错误;由于未转义的“E”,它正在沿着一条越野车路走下去。所以它意外地假设整个事情都是字面意思。

2.ToString("TR000")被解释为隐含的“TR”字面加上3个零填充数字作为整数值;因此,你得到“TR002”。

如果你真的想要TE和TR逐字,表达式2.ToString("\"TE\"000")2.ToString("\"TR\"000")将通过将TE和TR指定为显式文字来实现,而不是让格式化程序猜测它们是否是有效格式说明符(并且错了)。

答案 1 :(得分:0)

ToString需要PARSE格式字符串并了解如何处理它。 我们来看看以下示例:

2.ToString("TE000"); //output TE000
2.ToString("E000"); //output 2E+000
2.ToString("0TE000); //output 2TE000
2.ToString("T"); //throws exception
2.ToString("TT"); //output TT

这表明如果ToString解析器可以理解至少部分格式,它将假设其余的只是用它打印的额外字符。如果格式对于给定的数字无效(例如,当您在数字上使用DateTime字符串格式时),则会抛出异常。如果它无法理解格式,它将返回格式字符串本身作为结果。

答案 2 :(得分:0)

您无法使用数字格式来实现自定义格式,而是使用以下内容:

int i = 2;
String.Format("TE{0:X3}", i);

答案 3 :(得分:-1)

Custom Numeric Format StringsE表示数字科学记数法的指数部分。由于2是指数表示法中的2E000,因此可以解释它。