Удивительный вывод int.ToString
Я работаю над проектом и нашел интересную проблему:
2.ToString("TE"+"000"); // output = TE000
2.ToString("TR"+"000"); // output = TR002
Я также пробовал несколько строк, кроме "TE"
, но все они имеют одинаковый правильный вывод.
Из любопытства, мне интересно, как это могло произойти?
Ответы
Ответ 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);
Ответ 4
См. Пользовательские строки числового формата. E
означает экспоненциальную часть научной нотации числа. Поскольку 2
2E000
в экспоненциальном обозначении, это может объяснить это.