Малоизвестные Способы Форматирования Строк
Про форматирование строк я уже писал на канале. И, казалось бы, какие тут могут быть сюрпризы? Давайте посмотрим.
Для краткости я буду приводить только формат в интерполированных строках. Всё то же самое будет работать и для
string.Format(). Также в примерах я сразу буду использовать значения. Но имейте в виду, что слева от двоеточия может идти имя переменной.1. Добавление нолей в начало числа:
$"{123:00000}" // "00123"
$"{45:00000}" // "00045"
$"{123456:00000}" // "123456"
$"{123:d5}" // "00123"
2. Кастомный формат для цены:$"{1234:$#,###.00}" // "$1,234.00"
$"{12:$#,###.00}" // "$12.00"
$"{1234.56:$#,###.00}" // "$1,234.56"
Здесь # – цифра или ничего, 0 – цифра или 0, запятая и точка – разделители тысяч и дробной части соответственно.3. Формат номера телефона:
$"{79012345678:+#(###)###-##-##}"
//"+7(901)234-56-78"
Отформатировать телефон в американском формате с точками можно, экранировав их:$"{18005551234:+# ###\\.###\\.####}"
//"+1 800.555.1234"
4. Форматирование процентов:$"{1.23:##.00%}" // "123%"
$"{1.23:##.00'%}" // "1.23%"
По умолчанию знак % умножает число на 100.5. Парсинг строки с разделителем тысяч:
Следующая строчка выдаст ошибку из-за запятой в строке:
int x = int.Parse("1,345");
Чтобы правильно спарсить эту строку, используйте перечисление NumberStyles из System.Globalization:int x = int.Parse("1,345", NumberStyles.AllowThousands);
// Результат: 1345
Перечисление можно использовать как битовые флаги. Можно убирать знак, пробелы, нули в десятичной части, символ валюты и т.п.:int x = int.Parse("$ +1,345.00 ",
NumberStyles.Number |
NumberStyles.AllowCurrencySymbol);
// Результат: 1345
6. Как избежать боксингаКак известно,
string.Format приводит к боксингу переданных в него аргументов. Любители микрооптимизаций могут использовать вместо этого метод ToString, передав в него формат:double x = 19.95;7. «Тетрарный» оператор
string str1 = string.Format("{0:C}", x);
string str2 = x.ToString("C");
Сразу оговорюсь, что это название я выдумал по аналогии с тернарным оператором.
string.Format может выводить различные значения, в зависимости от знака переданного аргумента: положительный, отрицательный или ноль. Для этого используется символ точки с запятой:$"{4.2:positive;negative;zero}" //positive
$"{-2:positive;negative;zero}" //negative
$"{0:positive;negative;zero}" //zero
Одну из частей можно опустить, тогда первая часть будет относиться к положительным числам и 0, а вторая к отрицательным:$"{0:yes;no}" // "yes"
Также можно использовать формат вывода:$"{42:#.00;(#.00)}" // "42.00"
$"{-42:#.00;(#.00)}" // "(42.00)"
Сколько из этих способов вы знали раньше? Пишите в комментариях.Источники:
- http://blog.stevex.net/2007/09/string-formatting-faq/
- http://blog.stevex.net/string-formatting-in-csharp/