Преобразовать строку в число. Пример использования процедуры Val() в Паскаль

Для преобразований строк в числа в Паскале используется стандартная процедура процедура $val()$ со следующей сигнатурой:

procedure Val(S: String; Var V; var Code : Integer);

где:

  1. $S$ - переменная со строковым типом (string). Должна представлять последовательность символов, формирующих знаковое целое число - это та строка, которую мы будем преобразовывать.
  2. $V$ - переменная типа Real или Integer (здесь имеет место перегрузка процедуры). В этой переменной будет содержаться число, если преобразование пройдёт успешно
  3. $Code$ - переменная типа Integer — позиция, в которой произошла ошибка при преобразовании, или нуль, если ошибки не было.

При этом следует отметить, что переменные $V$ и $Code$ принимаются переменной по ссылке -- то есть хотя процедура и не возвращает значений, но она изменит значения этих двух переменных в области вызова и таким образом можно будет получить результат преобразования.

Что делает процедура val()

  • Процедура $val()$ делает попытку преобразовать строковое значение $S$ в его числовое представление $V$.
  • Переменная $Code$ будет содержать номер позиции, в которой произошла ошибка при преобразовании, или нуль, если ошибки не было.
  • Для успешного преобразования, необходимо, чтобы значение $S$ было корректной записью числа, рассмотрим примеры вызовов для разных значений и их типов:
    var
      intChislo, Code : Integer;
      rChislo: real;
      s: string;
    
    begin
    
     s := '123';
     Val(s, intChislo, Code);
     writeln(intChislo, ' | Error code: ', Code);
     // Получим: 123 | Error code: 0 -- все хорошо
    
     s := '1q23';
     Val(s, intChislo, Code);
     writeln(intChislo, ' | Error code: ', Code);
     { Получим: 0 | Error code: 2
       -- т.к. в позиции 2 стоит некорректный для числа символ q}
    
     s := '17.5';
     Val(s, intChislo, Code);
     writeln(intChislo, ' | Error code: ', Code);
     { Получим: 0 | Error code: 2
       -- т.к. в позиции 3 стоит точка, а этот символ
       не участвует в записи типа integer,
       т.е. '17.5' некорректный литерал для преобразования в integer}
    
     s := '17.5';
     Val(s, rChislo, Code);
     writeln(rChislo, ' | Error code: ', Code);
     { Получим:  1.7500000000000000E+001 | Error code: 0
       -- прошло успешно, т.к. '17.5' корректный литерал
       для преобразования в real}
    
      readln(); // удерживаем консоль
    end.    
    

Пример использования $val()$ с обработкой кода ошибки


var
  I, Code : Integer;
  s: string;

begin
 writeln('vvedite chislo:');
 readln(s); { <-- получаем строковое представление числа
(предположительно, строку цифр
-- ведь на самом деле мы не знаем что введёт пользователь }

// далее попытаемся преобразовать полученную строку в число

 Val(s, I, Code); // вызываем процедуру преобразования
 { Была ошибка при преобразовании ? }
 if (Code <> 0) then
   writeln('Oshibka pri preobrazovanii v pozicii : ', Code)
 else
   writeln('Uspeshno poluchili chislo = ', I);

  readln(); // удерживаем консоль
end. 

Источники:

vedro-compota's picture

function myIntVal(S: string): integer
var V, Code: integer;
begin
 Val(S; Var V; var Code : Integer);
 if(code = 0) then
    writeln(number)
 else begin
    writeln('Error: [' . S . '] ne chislo! ');
    Exit;
 end;
 result := V;
end

_____________
матфак вгу и остальная классика =)