Обучение C#

Формула программиста
основатель — Волосатов Евгений Витольдович

Форматированный вывод встроенных числовых типов данных

Для преобразования любых типов данных к их строковому представлению с целью их вывода в понятном пользователю виде часто приходится использовать форматированный вывод.

Метод ToString()

С целью форматированного вывода числа часто используется метод ToString() класса Object. Поскольку в языке C# любой класс является наследником класса Object, то все классы наследуют метод ToString(), и большинство из них переопределяют его.
Если метод ToString() вызывается без параметров, то используется формат вывода по умолчанию.
Тип данныхКлассТочность по умолчанию
byte
sbyte
Byte
SByte
до 3 знакомест
short
ushort
Int16
UInt16
до 5 знакомест
int
uint
Int32
UInt32
до 10 знакомест
longInt64 до 19 знакомест
ulongUInt64 до 20 знакомест
floatSingle до 7 значащих цифр
doubleDouble до 15 значащих цифр
decimalDecimal до 29 значащих цифр
Для форматов с плавающей точной знак экспоненты E отображается
  • если число содержит больше цифр, чем предоставлено для его отображения,
  • если порядок числа меньше чем 10-4.
Если пользователю требуется вывести число в другом формате, то для этого можно создать строку формата числа и передать ее методу ToString(string) в качестве аргумента. При форматировании строки для вывода числа используются следующие специальные символы, основные из которых представлены в таблице.
СимволНазначениеКомментарий
0Заменитель нуля Заменяет ноль соответствующей цифрой, если такая имеется. В противном случае в результирующей строке будет стоять ноль.
#Заменитель цифры Заменяет знак # соответствующей цифрой, если такая имеется. В противном случае в результирующей строке не будет цифры.
,Разделитель групп
Масштаб числа
В качестве разделителя групп вставляет локальный разделитель между группами по 3 символа. Чтобы в строках явно отделять тысячи, к обычному шаблону слева добавляется "0,".
В качестве масштабирования разделяет число на 1000 столько раз, сколько встречается символ ",".
.Точка Разделитель целой и дробной части. Допускается явно указывать формат целой и дробной части числа.
;Разделитель секций Определяет секции с раздельными строками формата для положительных чисел, отрицательных чисел и нуля.
E
e
Экспоненциальная нотация Определяет форматирование числа в экспоненциальной форме.
F
f
Точность Определяет количество разрядов, которое требуется вывести после разделителя целой и дробной части, которое указывается непосредственно после символа "F".
G
g
По умолчанию Использует формат по умолчанию для вывода числа.
D
d
Количество десятичных цифр Определяет количество цифр целого числа, которое требуется вывести, которое указывается непосредственно после символа "D". Если число отрицательное, то знак "-" в это количество цифр не входит.
(Символ определен только для целых чисел).
N
n
Число Использует для отображения числа разделитель тысяч и дробную часть. Отображаемой количество символов дробной части указывается непосредственно после символа "N" (по умолчанию выводится 2 символа дробной части).
P
p
Процент Преобразует выводимое число в проценты, умножая его на 100. После числа выводится символ "%".
X
x
Шестнадцатеричный формат Выводит число в шестнадцатеричном формате.
(Символ определен только для целых чисел).
Пример форматирования целого числа.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int a = 12345;
      string[] formats = { "000000", "######", "0,0", "0,",
        "+0;-0;0", "F5", "D8", "N", "N5", "X", "P" };
      foreach (string format in formats)
      {
        Console.WriteLine( String.Format("{0,-8}", format) + ": "
          + a.ToString(format));
      }
      Console.ReadKey();
    }
  }
}
image articles/521/521_1.png
 
8
int a=-2;
image articles/521/521_2.png
 
Пример форматированного вывода вещественного числа.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      double a = 12.345;
      string[] formats = { "000.0000", "0.00000", "0,0", "###.##",
        "F5", "0.0e+0", "+0.00;-0.00;0", "N", "N5", "P" };
      foreach (string format in formats)
      {
        Console.WriteLine(String.Format("{0,-15}", format) + ": "
          + a.ToString(format));
      }
      Console.ReadKey();
    }
  }
}
image articles/521/521_3.png
 
8
      double a = 0.00012345;
image articles/521/521_4.png
 

Метод String.Format()

Более широкими возможностями форматирования данных для представления их в виде строки обладает статический метод Format() класса String. Этот метод позволяет создавать строку, состоящую как из последовательности символов, так и из данных в указанном формате, которые подставляются на отведенные места.
Общий вид вызова этого метода имеет следующий вид:
String.Format(String format, Object arg0, Object arg1, ...);
Метод возвращает полученную в результате форматирования строку. Количество аргументов типа Object, указанных при выводе метода, определяется количеством местодержателей, в которых значения этих объектов необходимо вывести.
Каждый местодержатель представляет собой размещенный в фигурных скобках номер объекта, который необходимо вывести на его место. Нумерация объектов начинается с 0:
{0}, {1} и т.д.
Общий вид строки формата может быть представлен в виде:
{aa,bb:cc.dd},
где
  • aa - номер объекта;
  • bb - количество знакомест, отводимое для вывода числа (положительное число соответствует выравниванию числа по правому краю, отрицательное число соответствует выравниванию числа по левому краю);
  • cc - форматирование целой части числа;
  • dd - форматирование дробной части числа.
Для форматирования целой и дробной части используются те же спецсимволы, что и для форматированного метода с помощью метода ToString().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int a = 12345;
      string[] formats = { "{1}", "{1,10:000000.0}", "{1,10:0.00}", "{1,10}",
      "{1,-10}", "{1:000000}", "{1:P}", "{1:X}", "{1:D6}", "{1,10:E2}" };
      foreach (string format in formats)
      {
        Console.WriteLine(String.Format("{0,-15}: " + format, format, a));
      }
      Console.ReadKey();
    }
  }
}
image articles/521/521_5.png
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      double a = 12.345;
      string[] formats = { "{1}", "{1:000.00000}", "{1,10:0.00}", "{1,10}",
      "{1,-10}", "{1,10:#.#####}", "{1:P}", "{1:F5}", "{1,10:F2}",
      "{1,10:E2}" };
      foreach (string format in formats)
      {
        Console.WriteLine(String.Format("{0,-15}: " + format, format, a));
      }
      Console.ReadKey();
    }
  }
}
image articles/521/521_6.png
 

Метод Convert.ToString()

Статический класс Convert предназначен для преобразования одного базового типа данных к другому. Рассмотрим преобразование числовых типов данных к строковому представлению с помощью этого класса.
МетодОписание
ToString(Byte)
ToString(SByte)
ToString(Int16)
ToString(UInt16)
ToString(Int32)
ToString(UInt32)
ToString(Int64)
ToString(UInt64)
ToString(Single)
ToString(Double)
Преобразует заданное число в эквивалентное строковое представление в формате по умолчанию.
ToString(Byte, IFormatProvider)
ToString(SByte, IFormatProvider)
ToString(Int16, IFormatProvider)
ToString(UInt16, IFormatProvider)
ToString(Int32, IFormatProvider)
ToString(UInt32, IFormatProvider)
ToString(Int64, IFormatProvider)
ToString(UInt64, IFormatProvider)
ToString(Single, IFormatProvider)
ToString(Double, IFormatProvider)
Преобразует заданное число в эквивалентное строковое представление, учитывая формат, реализуемый интерфейсом IFormatProvider. В качестве второго аргумента могут выступать объекты классов:
  • NumberFormatInfo - предоставляет сведения, используемые для форматирования чисел, таких как валюта, разделитель разрядов, и десятичный разделитель для определенного языка и региональных параметров;
  • DateTimeFormatInfo - предоставляет сведения, используемые для форматирования даты и времени, например символы разделителя даты и времени для языка и региональных параметров или порядка и формат года, месяца и дневных компонентов даты;
  • CultureInfo - представляет определенный язык и региональные параметры.
ToString(Byte, Int32)
ToString(Int16, Int32)
ToString(Int32, Int32)
ToString(Int64, Int32)
Преобразует заданное целое число в эквивалентное строковое представление, в системе счисления, указанной в качестве второго аргумента. Поддерживаются системы счисления с основаниями:
  • 2,
  • 8,
  • 10,
  • 16.
Рассмотрим пример вывода числа в различных системах счисления.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int a = 12346;
      Console.WriteLine(Convert.ToString(a, 2));
      Console.WriteLine(Convert.ToString(a, 8));
      Console.WriteLine(Convert.ToString(a, 10));
      Console.WriteLine(Convert.ToString(a, 16));
      Console.ReadKey();
    }
  }
}
image articles/521/521_7.png
Аналогичным образом можно ввести число, записанное в заданной системе счисления. С этой целью можно воспользоваться одним из следующих методов класса Convert. Все эти методы возвращают целое число в указанном формате.
  • ToByte(String, Int32);
  • ToInt16(String, Int32);
  • ToInt32(String, Int32);
  • ToInt64(String, Int32);
В указанных методах в качестве первого аргумента вводится текстовая строка, а в качестве второго аргумента - основание системы счисления преобразуемого числа, которое может принимать значения 2, 8, 10 или 16.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int a;
      a = Convert.ToInt32(Console.ReadLine(), 2);
      Console.WriteLine(a);
      Console.ReadKey();
    }
  }
}
image articles/521/521_8.png
Однако указанные методы не являются защищенными, и при попытке преобразования в число строки, содержащей не только цифры числа в указанной системе счисления, возникает исключение.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int a;
      try
      {
        a = Convert.ToInt32(Console.ReadLine(), 2);
        Console.WriteLine(a);
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.Message);
      }
      Console.ReadKey();
    }
  }
}
image articles/521/521_9.png
 
Таким образом, в статье приведены основные способы форматированного вывода числовых данных встроенных типов. Наиболее универсальным инструментом для этого является метод String.Format(), который, кстати, используется по умолчанию функциями консольного вывода Console.Write() или Console.WriteLine():
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int a = 12345;
      Console.WriteLine("a = {0,8}", a);
      Console.ReadKey();
    }
  }
}


Автор: Вставская Елена Владимировна

 
Написать комментарий:




Начинаем практику по языку C#




Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.