我一直致力于一个项目,并发现了一个有趣的问题:
2.ToString("TE"+"000"); // output = TE000
2.ToString("TR"+"000"); // output = TR002
我也尝试过除"TE"
之外的几个字符串,但都具有相同的正确输出。
出于好奇,我想知道这怎么可能发生?
答案 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 Strings。 E
表示数字科学记数法的指数部分。由于2
是指数表示法中的2E000
,因此可以解释它。