Числа
Преобразования типов
Нередко возникают ситуации, когда нужно преобразовать один тип данных в другой. Например, целое число в вещественное или в строку, и обратно.
Целое число можно сразу же присвоить вещественному - преобразование произойдет автоматически. Например,
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(Формат, Значение);
Формат - это строка с маской, Значение - исходное вещественное число. Функция возвращает в качестве результата указанное вещественное число в виде строки, отформатированной согласно маске.
Символ | Описание |
---|---|
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