Patrick Skelton Ответов: 3

Как добавить ведущие нули к новым интерполированным строкам C#?


Привет,

Я изо всех сил пытаюсь понять, как заполнить целочисленное поле ведущими нулями в новых интерполированных строках C#.

Согласно этой статье C#6: Интерполяция Строк, "Та же самая составная сила форматирования существует для указания таких вещей, как значащие цифры и ведущие нули."

В этой же статье есть ссылка на эту страницу: Строки Стандартных Числовых Форматов [^Согласно этой странице, что-то вроде "D2" должно использовать две цифры для целого числа и площадку с нулями. Когда я пробую его, кажется, что он ничего не делает.

Напр.

int x = 3;
Console.WriteLine( $"Integer padded to two places: {x:D2}." );

Это печатает "3", а не"03".

Кто-нибудь знает, как это сделать?

Добрые пожелания ~ Патрик

PS-судя по обсуждению ниже, мне кажется, что я не был на 100% ясен в том, чего я пытаюсь достичь.

Я знаю, что числа всегда будут находиться в диапазоне 0 & lt;= x <= 99. Когда я получаю вход в диапазоне 0-9, я хочу, чтобы он добавил один ведущий ноль (например, 4 печатает "04", но 14 печатает "14"). Надеюсь, это прояснит вопрос.

Что я уже пробовал:

В дополнение к коду, показанному выше, я попробовал "##"," DD " и несколько других вариантов, которые я забыл.

Richard Deeming

Ваш код печатается 03 для меня.

Какой вывод вы получаете, используя более старый синтаксис?
Console.WriteLine("X = {0:D2}", x);

Mario Z

Как и Ричард, я получаю ожидаемое "целое число" в двух местах: 03."
Какую версию VS вы используете? Это может быть проблема с версией, возможно, вы используете VS 2013 и сами скачали Roslyn, и в этом случае, возможно, вы используете более старый компилятор.

Patrick Skelton

Ммм... может быть, это проблема компилятора. На самом деле я нахожусь в приложении Xamarin.iOS, которое, как мне кажется, вполне может использовать компилятор Roslyn.

Если я попробую это сделать:

int x = 3;
строка s = строка.Формат ("{0:D2}", x );
Приставка.WriteLine( s );

Я все еще не получаю мягкого целого числа.

Richard Deeming

Похоже, это ошибка / "функция" в Xamarin.iOS; ваш код отлично работает в стандартном приложении .NET.

3 Ответов

Рейтинг:
9

Kristian Lindberg Vinther

Конкретный пример:

var number = 123;
Console.WriteLine($"{number:000000}");

// 000123


Рейтинг:
22

RickZeeland

Не совсем C# 6, но просто:

string x = "3";
Console.WriteLine(x.PadLeft(2, '0'))


Patrick Skelton

Это дополняет целое число, но с использованием пробела, а не ведущего нуля (во всяком случае, для меня - см. комментарий о компиляторе выше).

Sergey Alexandrovich Kryukov

Это решение так неправильно!
Я хочу, чтобы вы это поняли.
Скажем, у вас есть номера 3 и 13. У вас будет
"003" и
"0013", выход разной ширины. Но совершенно очевидно, что исследователь действительно нуждается в выводе фиксированной ширины:
"003"
"013" и так далее...
—СА

RickZeeland

Странно, но когда я тестирую с .NET 4.52, он работает так, как должен, читайте об этом здесь, если не верите: https://msdn.microsoft.com/en-us/library/92h5dc07(v=против 110). aspx

Sergey Alexandrovich Kryukov

Ты не понимаешь. Нет необходимости проверять, ваш метод работает так, как вы ожидали, но то, что вы ожидали, не является тем, что требуется.

Требование-это заполнение, что означает, например (псевдокод):

если вход в 0..9, pad 3 '0'
если вход в 10..99, pad 2 '0'
если вход в 100...999 pad 1 '0'
еще нет обивка

Вы видите эту идею? Во всех диапазонах длина должна быть одинаковой, например, 4 цифры. И это решается всего одной строкой.Формат, например, с использованием пользовательского формата с заполнителями '0'.

—СА

RickZeeland

Просто протестируйте его, и вы увидите, что длина строки останется прежней.

Sergey Alexandrovich Kryukov

Ах... моя ошибка, извините.
Мой 5. Спасибо, что доказали свою точку зрения.
—СА

Patrick Skelton

Я проголосовал за это до 5*, потому что эта дискуссия действительно заставила меня задуматься об этом, и, играя с приведенными выше вариантами, я обнаружил, что часть проблемы была ошибкой, которую я вводил. Одна из ловушек попытки опубликовать самый маленький пример кода, демонстрирующий проблему. Думаю, мне нужно поднять руки и сказать, что я, должно быть, на самом деле не запускал _exact_ тот же код, который я опубликовал выше. Извините, ребята, если я зря потратил чье-то время.

Итак, чтобы быть ясным, я могу заставить $"x:00" работать так, как ожидалось, используя компилятор Xamarin.iOS. И инструмент, предложенный выше (https://code.msdn.microsoft.com/net-framework-4-formatting-9c4dae8d) - это божий дар для быстрой игры с этой штукой.

Большое вам спасибо за детальную помощь. - Патрик

Sergey Alexandrovich Kryukov

Правильно. Обратите внимание: я признал свою ошибку выше.
—СА

Рейтинг:
16

Sergey Alexandrovich Kryukov

"D "или" d "в спецификаторе, найденном в" стандартных строках числового формата", - это не так. Это не ведущий / отступ, это "спецификатор точности: минимальное количество цифр". Вы видите разницу? Вот дополнительное объяснение: Строки Стандартных Числовых Форматов [^].

Для ведущих цифр или отступов вам нужны " пользовательские строки числового формата": Строки Настраиваемых Числовых Форматов [^].

Обратите внимание на первую строку, спецификатор "0", см. Также"#". Поиграйте с ним немного, и вы быстро поймете, что это на самом деле значит.

—СА


Matt T Heffron

Из приведенной Вами ссылки на строки стандартного числового формата "D2"будет заполнять 0-9 с ведущим 0, >= 10 не будет заполняться.
Если ОП знает, что все их значения равны <= 99, то "D2" - это совершенно правильный способ выполнить вывод с фиксированной шириной 2 символа.

Sergey Alexandrovich Kryukov

Вы правы, но спрашивающий недоволен, и обычно это происходит, когда люди хотят получить точную фиксированную длину выходной строки для определенного диапазона чисел, дающих разные длины в противном случае...
—СА