Урок 17. Конвертация чисел в строки (Number в String) C#
Все уроки по C# расположены здесь.
В этой статье мы продолжим изучение преобразований между строковым и числовым типами данных, теперь уже направление такое: из Number в String.
На предыдущем уроке мы занимались конвертированием строк в числа – это особенно полезно при приеме числовых данных от пользователя. Точно так же важно преобразовывать числовые данные в строковую информацию при выводе на экран, принтер или другие устройства.
Метод ToString
Каждый тип данных и класс в Framework включает метод toString, который возвращает строковое представление значения или объекта, для которого выполняется метод. Некоторые классы создают объекты, которые не так легко представить в виде строк. В этих случаях, как правило, возвращает метод toString класса полное имя, который содержит пространство имен и имя типа. Например
object anObject = new object(); Console.WriteLine(anObject.ToString()); // Выведет "System.Object"Простое преобразование с использованием ToString
Самым простым методом преобразования чисел в строки является использование метода ToString для типа без параметров. Произведенная строка содержит неформатированное число. Этот метод можно использовать для переменных и литералов.
int quantity = 1500; float price = 1.50F; bool sold = true; Console.WriteLine(quantity.ToString()); // Выведет "1500" Console.WriteLine(price.ToString()); // Выведет "1.5" Console.WriteLine(sold.ToString()); // Выведет "True"Форматирование конвертированных значений
При отображении значений пользователю необходимо отформатировать их соответственно их назначению и локальным настройкам. ToString метод позволяет добавлять спецификаторы формата, которые определяют это форматирование. Спецификаторы формата добавляются в строковый параметр.
int quantity = 1500; float price = 1.50F; float discount = 0.05F; Console.WriteLine(quantity.ToString("n0", new CultureInfo("en-US"))); // Выведет "1,500" Console.WriteLine(price.ToString("c", new CultureInfo("en-US"))); // Выведет "$1.50" Console.WriteLine(discount.ToString("p1", new CultureInfo("en-US"))); // Выведет "5.0 %"Три спецификатора, используемые в приведенных выше примерах, предоставляют форматирование с фиксированной точкой (n), валютой (c) и процентом (p). В случае спецификатора фиксированной точки и процента включается число. Это описатель точности и используется для изменения формата.
Доступные спецификаторы формата
Полный список спецификаторов формата и эффект спецификатора точности для каждого выглядит следующим образом
- C или c. Форматирует число как денежное значение, включая правильное число десятичных знаков и соответствующий символ валюты для локальной настройки пользователя. Указывает фиксированное число знаков после запятой.
- D или d. Форматирует целые числа только как простые целые числа. Задает минимальное количество цифр. При необходимости добавляются ведущие нули.
- E. Форматы чисел в экспоненциальной нотации. Результирующая строка содержит заглавную букву 'E'. Указывает фиксированное число десятичных знаков для мантиссы. Если опущено, используется шесть десятичных знаков.
- e. Форматирует числа, используя экспоненциальную нотацию. Результирующая строка содержит строчную букву 'e'. Указывает фиксированное число десятичных знаков для мантиссы. Если опущено, используется шесть десятичных знаков.
- F или f. Форматирует числа с использованием записи с фиксированной точкой. Указывает фиксированное число знаков после запятой.
- G или g. Форматирует числа с использованием экспоненциальной или фиксированной точечной нотации, в зависимости от того, что создает самую короткую строку. Фактические результаты зависят от типа преобразуемых данных и от того, используется ли спецификатор точности.
- N или n. Форматирует числа с помощью записи с фиксированной точкой с разделителями тысяч. Указывает фиксированное число знаков после запятой.
- P или p. Форматирует числа, используя процентную нотацию. Например, 0.25 форматируется как 25%. Указывает фиксированное число знаков после запятой.
- R или r. Форматы чисел с помощью кругового формата. Это специальный формат, который гарантирует, что сгенерированная строка может быть преобразована обратно в исходное число с помощью методов синтаксического анализа.
- X. Преобразует числа в строковое представление их шестнадцатеричного значения. Используются цифры от 0 до 9 и от A до F. Задает минимальное количество цифр. При необходимости добавляются ведущие нули.
- x. Преобразует числа в строковое представление их шестнадцатеричного значения. Используются цифры от 0 до 9 и от a до f. Задает минимальное количество цифр. При необходимости добавляются ведущие нули.
Спецификаторы стандартного формата полезны в большинстве случаев. Однако могут возникнуть ситуации, когда спецификаторы формата не дают желаемых результатов. В этих случаях можно использовать графический формат. Графический Формат - это строка, содержащая специальные символы, влияющие на конечное преобразование. Существует несколько управляющих символов, каждый из которых будет рассмотрен в следующих разделах.
Нуль заполнитель
Нулевая цифра-заполнитель (0) в графическом формате указывает, что в результирующей преобразованной строке требуется цифра. Если в исходном номере есть цифра в позиции-заполнителе, она копируется в конечный результат. Если в этой позиции нет цифры, то вместо нее используется ноль. Это позволяет генерировать ведущие нули. Если целочисленная часть преобразовываемого числа больше, чем число цифр-заполнителей, дополнительные цифры будут включены, чтобы избежать усечения.
int small = 12; int large = 123456; float tiny = 1.234F; Console.WriteLine(small.ToString("0000")); // Выведет "0012" Console.WriteLine(large.ToString("0000")); // Выведет "123456" Console.WriteLine(tiny.ToString("0000")); // Выведет "0001"Заполнитель десятичная точка
Второй специальный символ является заполнителем десятичной точки. Он может быть объединен с нулевым заполнителем, чтобы определить количество цифр, необходимых как до, так и после десятичной точки. Хотя символ-заполнитель десятичной запятой всегда является символом полной остановки или точки (.), фактический символ в результирующей строке зависит от локальных параметров пользователя. В примерах предполагается, что пользователь имеет конфигурацию Великобритании
int small = 12; double large = 123456.789; float tiny = 1.234F; Console.WriteLine(small.ToString("00.00")); // Выведет "12.00" Console.WriteLine(large.ToString("00.00")); // Выведет "123456.79" Console.WriteLine(tiny.ToString("00.00")); // Выведет "01.23"Заполнитель цифр
Заполнитель цифр (#) похож на нулевой заполнитель. Он определяет положение цифры в результирующей отформатированной строке и вызывает округление после десятичной точки. Однако заполнитель цифр не приводит к добавлению начальных или конечных нулей в число, где исходное числовое значение не имеет цифры в соответствующей позиции.
int small = 12; double large = 123456.789; float tiny = 1.234F; Console.WriteLine(small.ToString("##.##")); // Выведет "12" Console.WriteLine(large.ToString("##.##")); // Выведет "123456.79" Console.WriteLine(tiny.ToString("##.##")); // Выведет "1.23"Заполнитель цифр имеет побочный эффект при преобразовании нулевого значения в строку. Так как заполнитель не вызывает создание начальных или конечных нулей, при преобразовании нулевого значения результирующая строка пуста.
Console.WriteLine(0.ToString("##.##"));Местозаполнитель разделителя тысяч
Заполнитель разделителя тысяч представлен в виде запятой (,). Если запятая включена в формат рисунка слева от десятичной точки и между нулевыми или цифровыми заполнителями, в результат вставляются разделители тысяч. Хотя символ-заполнитель тысяч всегда является запятой, фактический символ в результирующей строке зависит от локальных параметров пользователя.
int small = 12; double large = 123456.789; float tiny = 1.234F;Символ масштабирования чисел
Console.WriteLine(small.ToString("#,#.00")); // Выведет "12.00" Console.WriteLine(large.ToString("#,#.##")); // Выведет "123,456.79" Console.WriteLine(tiny.ToString("#,#.##")); // Выведет "1.23"
Символ масштабирования чисел представлен в виде запятой (,). Чтобы отличить разделитель тысяч, символ масштабирования чисел должен отображаться непосредственно слева от десятичной точки или в конце формата изображения, если нет местозаполнителя десятичной точки. Каждая включенная запятая делит число на тысячу перед применением форматирования.
int miles = 123456789; Console.WriteLine(miles.ToString("#,#,")); // Выведет "123,457" Console.WriteLine(miles.ToString("#,#,,.###")); // Выведет "123.457" Console.WriteLine(miles.ToString("#,#,,")); // Выведет "123"Процентный заполнитель
Заполнитель процента ( % ) используется при отображении значений процента. Местозаполнитель указывает позицию в результирующей строке, где должен отображаться символ процента, и умножает значение на сто. Фактический вставленный символ основан на локальных настройках пользователя.
int small = 12; double large = 123456.789; float tiny = 0.0015F; Console.WriteLine(small.ToString("#,#.#%")); // Outputs "1,200%" Console.WriteLine(large.ToString("#,#.#%")); // Outputs "12,345,678.9%" Console.WriteLine(tiny.ToString("#,#.#%")); // Outputs ".2%"Пользовательская экспоненциальная нотация
Графические форматы можно использовать для создания собственных научных или экспоненциальных обозначений. Для определения точного форматирования используется несколько символов. Первый символ, который требуется - верхний регистр " E "или нижний регистр"e". Это означает, что должна использоваться экспоненциальная нотация. Затем следует один или несколько нулей, чтобы указать минимальное количество цифр для экспоненты. Форматирование мантиссы управляется символами-заполнителями, которые появляются перед 'E'.
int small = 12; double large = 123456.789; float tiny = 0.0015F; Console.WriteLine(small.ToString("0.0E0")); // Выведет "1.2E1" Console.WriteLine(large.ToString("0.00e00")); // Выведет "1.23e05" Console.WriteLine(tiny.ToString("0.00E00")); // Выведет "1.50E-03"Экспоненциальная нотация может быть изменена путем включения символа плюс или минус после буквы. "+"Означает, что знак для значения экспоненты всегда должен быть включен. Минус " - " означает, что знак должен отображаться только для отрицательных значений экспоненты.
int small = 12; double large = 123456.789; float tiny = 0.0015F; Console.WriteLine(small.ToString("0.0E-0")); // Выведет "1.2E1" Console.WriteLine(large.ToString("0.00e+00")); // Выведет "1.23e+05" Console.WriteLine(tiny.ToString("0.00E+00")); // Выведет "1.50E-03"Литерал
Часто числовые значения должны быть отформатированы для включения нечисловых символов. Это может быть достигнуто путем вставки символов в формате изображения. Чтобы вставить символы-заполнители, описанные в предыдущих разделах, заключите их в апострофы ( ' ) или кавычки ("). Для удобства чтения в следующем примере используется апостроф.
Console.WriteLine(12345.ToString("00-00-00")); // Выведет "01-23-45" Console.WriteLine(12345.ToString("0'E'")); // Выведет "12345E"Экранирующий символ
Escape-символы также могут использоваться в строках графического формата. Они используют стандартный символ обратной косой черты для идентификации escape-последовательности. Эта обратная косая черта должна появиться в самой строке формата, поэтому она должна быть вставлена с помощью двойной обратной косой черты, если перед форматом рисунка не стоит символ"@". Чтобы вставить символ обратной косой черты в конечную строку, четыре обратной косой черты должны быть включены в формат рисунка.
Console.WriteLine(123.45.ToString("\\'0.00\\'")); // Выведет "'123.45'" Console.WriteLine(12345.ToString("000\\\\000")); // Выведет "012\345"Разделитель
Последний специальный символ, который можно вставить в формат изображения, является разделителем сечений. Это позволяет использовать различное форматирование для положительных, отрицательных и нулевых значений. Если один знак точки с запятой (;) включен формат слева от точки с запятой, то он используется для положительных значений и формат справа для отрицательных чисел. Добавление разделителя второго раздела создает третий раздел для нулевых значений. Если второй раздел пуст, то как положительные, так и отрицательные форматы будут использовать форматирование из первого раздела.
Console.WriteLine(1.ToString("0.0;(0.0)")); // Выведет "1.0" Console.WriteLine((-1).ToString("0.0;(0.0)")); // Выведет "(1.0)" Console.WriteLine(1.ToString("0.0;(0.0);#.#")); // Выведет "1.0" Console.WriteLine((-1).ToString("0.0;(0.0);#.#")); // Выведет "(1.0)" Console.WriteLine(0.ToString("0.0;(0.0);#.#")); // Выведет пустую строку Console.WriteLine(1.ToString("0.0;;#.#")); // Выведет "1.0" Console.WriteLine((-1).ToString("0.0;;#.#")); // Выведет "-1.0" Console.WriteLine(0.ToString("0.0;;#.#")); // Выведет пустую строку
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.