Подтвердить что ты не робот

Удивительный вывод int.ToString

Я работаю над проектом и нашел интересную проблему:

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

Я также пробовал несколько строк, кроме "TE", но все они имеют одинаковый правильный вывод.

Из любопытства, мне интересно, как это могло произойти?

4b9b3361

Ответ 1

Просто на основе документации Microsoft Пользовательские строки числового формата ваши строки "TE000" и "TR000" являются строками произвольного формата, но четко они разбираются по-разному.

2.ToString("TE000") - всего лишь ошибка в форматировании; это происходит из-за необработанного "E". Поэтому неожиданно предполагается, что все это буквально.

2.ToString("TR000") интерпретируется как подразумеваемый литерал "TR" плюс 3 нуль-заполненных цифры для целочисленного значения; поэтому вы получаете "TR002".

Если вы действительно хотите TR и verbatim, выражения 2.ToString("\"TE\"000") и 2.ToString("\"TR\"000") выполнит это для вас, указав TE и TR как явные литералы, вместо того, чтобы позволить предсказателю форматирования, если они являются допустимыми спецификаторами формата (и это неправильно).

Ответ 2

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 для числа), он генерирует исключение. Если он не может понять формат, он вернет в качестве результата строку формата.

Ответ 3

Вы не можете использовать числовой формат для достижения пользовательского формата, вместо этого используйте что-то вроде этого:

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