令人惊讶的国际化.到字符串输出

本文关键字:字符串 输出 国际化 | 更新日期: 2023-09-27 18:33:18

我一直在做一个项目,发现了一个有趣的问题:

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

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

出于好奇,我想知道这是怎么发生的?

令人惊讶的国际化.到字符串输出

仅根据Microsoft的文档自定义数字格式字符串,您的字符串"TE000"和"TR000"都是自定义格式字符串,但显然它们的解析方式不同。

2.ToString("TE000")只是格式化程序中的一个错误;由于未逃脱的"E",它正在走上一条错误的路径。因此,出乎意料地假设整个事情都是字面意思。

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

如果您真的想要逐字 TE 和 TR,表达式 2.ToString("'"TE'"000")2.ToString("'"TR'"000") 将通过将 TE 和 TR 指定为显式文本来为您完成此操作,而不是让格式化程序猜测它们是否是有效的格式说明符(并弄错了)。

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

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 字符串格式时),它将引发异常。如果它不能理解格式,它将返回格式字符串本身作为结果。

您不能使用数字格式来实现自定义格式,而应使用如下所示的内容:

int i = 2;
String.Format("TE{0:X3}", i);
<</div> div class="answers">

请参阅自定义数字格式字符串。E表示数字的科学记数法的指数部分。由于2是以指数表示法2E000的,这也许可以解释它。