Учебный центр "ANIT Texno Inform"
Опубликован: 25.06.2014 | Доступ: свободный | Студентов: 2596 / 851 | Длительность: 24:39:00
Специальности: Программист
Лекция 8:

Числа

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

Преобразования типов

Нередко возникают ситуации, когда нужно преобразовать один тип данных в другой. Например, целое число в вещественное или в строку, и обратно.

Целое число можно сразу же присвоить вещественному - преобразование произойдет автоматически. Например,

var
  r: real;
begin
  r:= 3;  //результат: 3.0
  …
    

Если есть желание, вы можете поступить так же, как в прошлых лекциях: создать новый проект с одной кнопкой, сгенерировать для кнопки событие нажатия, и все примеры пробовать в этом событии. Раздел переменных и начало события begin указаны, не забудьте в конце события оставить end;

Вещественное число присвоить целой переменной нельзя - компилятор выдаст ошибку. В этом случае мы можем поступить двумя способами: либо просто отбросить дробную часть, либо округлить вещественное число до ближайшего целого. Математическая функция Trunc() отсекает дробную часть, и возвращает целое число:

var
  i: integer;
begin
  i:= Trunc(3.65); //результат = 3
  …
    

Математическая функция Round() округляет вещественное число до ближайшего целого:

var
  i: integer;
begin
  i:= Round(3.65); //результат = 4
  …
    

Если целое число требуется преобразовать в строку, используют функцию IntToStr(), нам уже приходилось это делать. В скобках указывают целое число любого целочисленного типа, а функция возвращает это же число в виде строки. Пример:

var
  i: integer;
  s: string;
begin
  i:= 10;
  s:= IntToStr(i); //теперь в s строка '10'
  ShowMessage(s);  //содержимое s можно вывести на экран
  …
    

Для обратного преобразования используют функцию StrToInt(), программист должен следить, чтобы в эту функцию попадало действительно целое число в виде строки. Пример:

var
  i: integer;
  s: string;
begin
  s:= '35';  //загрузили число в виде строки
  i:= StrToInt(s);  //преобразовали строку '35' в число 35
  i:= i * 2;  //теперь здесь 70
  s:= IntToStr(i);  //получили строку '70'
  ShowMessage(s);  //содержимое s выводим на экран
  …
    

Если строку требуется преобразовать в вещественное число, используют функцию StrToFloat():

var
  r: real;
  s: string;
begin
  s:= '3,14';
  r:= StrToFloat(s);
    

Обратите внимание - здесь в строковую переменную мы внесли вещественное число в виде строки. При этом десятичную часть мы разделили не точкой, а запятой: "3,14". Так положено вносить числа в операционной системе, если установлена русская версия Windows. В английской версии разделителем является точка. Данная настройка зависит от глобальной переменной DecimalSeparator. Переменную объявлять не нужно - она уже объявлена, и содержит символ системного разделителя дробной части.

Для преобразования вещественного числа в строку можно использовать две функции. Проще всего воспользоваться функцией FloatToStr():

var
  r: real;
  s: string;
begin
  r:= 3.14;  //здесь мы вводим число, а не строку, поэтому разделитель - точка
  s:= FloatToStr(r); //теперь в s строка '3,14'
  ShowMessage(s);
    

Если мы попытаемся ввести в вещественную переменную r число, используя в качестве разделителя запятую, то произойдет ошибка. Числа нужно разделять точкой, а числа в виде строки - запятой (в русской Windows).

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

FormatFloat(Формат, Значение);
    

Формат - это строка с маской, Значение - исходное вещественное число. Функция возвращает в качестве результата указанное вещественное число в виде строки, отформатированной согласно маске.

Таблица 8.4. Символы формата
Символ Описание
0 В данную позицию записывается цифра. Если в исходном числе в данной позиции была цифра - записывается она. Иначе будет записан '0'.
# В данную позицию записывается цифра. Если в исходном числе в данной позиции была цифра - записывается она. Иначе в данную позицию ничего не записывается.
. Данный символ, встречающийся в маске первый раз, определяет расположение десятичного разделителя. Любой последующий символ '.' игнорируется. Символ, который будет использован в качестве десятичного разделителя в результирующей строке, хранится в глобальной переменной DecimalSeparator.
, Если маска содержит данный символ, то в отформатированной строке, между каждой группой из трех цифр слева от десятичной точки, будут вставлены разделители тысяч. Положение и количество символов ',' в маске на результат не влияет. Символ, который будет использован в качестве разделителя тысяч, определяется глобальной переменной ThousandSeparator.
E+ Экспоненциальный формат. Если любая из строк: 'E+', 'E-', 'e+', 'e-', содержится в строке формата, то результирующее значение будет представлено в экспоненциальном виде. За одной из этих строк могут следовать символы '0', определяющие минимальное число цифр в экспоненте.
; Отделяет в маске варианты форматирования для положительного, отрицательного и нулевого значения.

Примечание: Если в маске после запятой должны выходить две цифры, а в вещественном числе их больше, дробная часть будет округлена.

Пример:

var
  r: real;
  s: string;
begin
  r:= 123.789;
  s:= FormatFloat('#.##', r);
  ShowMessage(s);  //результат - '123,79' - дробная часть округлена
  r:= 789.123;
  s:= FormatFloat('#.##', r);
  ShowMessage(s);  //результат - '789,12'
    

Для денежных расчетов можно применить маску '#.00' - это гарантирует две цифры после запятой. Если цифр нет, будут выведены нули, например

123,00
    
< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Инга Готфрид
Инга Готфрид
Александр Скрябнев
Александр Скрябнев

Через WMI, или используя утилиту wmic? А может есть еще какие более простые пути...