Преобразовать строку в число. Пример использования процедуры Val() в Паскаль
![]()
Для преобразований строк в числа в Паскале используется стандартная процедура процедура $val()$ со следующей сигнатурой:
procedure Val(S: String; Var V; var Code : Integer);
- $S$ — переменная со строковым типом (string). Должна представлять последовательность символов, формирующих знаковое целое число — это та строка, которую мы будем преобразовывать.
- $V$ — переменная типа Real или Integer (здесь имеет место перегрузка процедуры). В этой переменной будет содержаться число, если преобразование пройдёт успешно
- $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.
- Val (процедура): http://pascal.net.ru/Val
Key Words for FKN + antitotal forum (CS VSU):
- паскаль число в строку функция
- Как преобразовать строку в число В Паскале
Руководство по программированию на C#. Преобразование строки в число
Для преобразования string в число используется вызов метода Parse или TryParse , который можно найти в числовых типах ( int , long , double и т. д.), или используются методы в классе System.Convert.
Немного эффективнее и проще вызвать метод TryParse (например, int.TryParse(«11», out number) ) или метод Parse (например, var number = int.Parse(«11») ). Использование метода Convert более удобно для общих объектов, реализующих IConvertible.
Можно использовать методы Parse или TryParse в числовом типе, который предположительно содержит строка, таком как тип System.Int32. Метод Convert.ToInt32 использует Parse внутри себя. Метод Parse возвращает преобразованное число; метод TryParse возвращает логическое значение, которое указывает, успешно ли выполнено преобразование, и возвращает преобразованное число в параметр out . Если строка имеет недопустимый формат, Parse создает исключение, а TryParse возвращает значение false . В случае сбоя операции синтаксического анализа при вызове метода Parse вы всегда должны использовать обработку исключений, чтобы перехватить FormatException.
Вызов метода Parse или TryParse
Методы Parse и TryParse игнорируют пробелы в начале и в конце строки, но все остальные символы должны быть символами, которые образуют соответствующий числовой тип ( int , long , ulong , float , decimal и т. д.). Любые пробелы в строке, образующие число, приводят к ошибке. Например, можно использовать для decimal.TryParse синтаксического анализа «10», «10,3» или «10», но этот метод нельзя использовать для синтаксического анализа 10 из «10X», «1 0» (обратите внимание на внедренное пространство), «10,3» (обратите внимание на внедренное пространство), «10e1» ( float.TryParse здесь работает) и т. д. Строку со значением null или String.Empty невозможно успешно проанализировать. Вы можете проверить наличие NULL или пустой строки, прежде чем пытаться ее проанализировать, вызвав метод String.IsNullOrEmpty.
В указанном ниже примере демонстрируются успешные и неуспешные вызовы методов Parse и TryParse .
using System; public static class StringConversion < public static void Main() < string input = String.Empty; try < int result = Int32.Parse(input); Console.WriteLine(result); >catch (FormatException) < Console.WriteLine($"Unable to parse ''"); > // Output: Unable to parse '' try < int numVal = Int32.Parse("-105"); Console.WriteLine(numVal); >catch (FormatException e) < Console.WriteLine(e.Message); >// Output: -105 if (Int32.TryParse("-105", out int j)) < Console.WriteLine(j); >else < Console.WriteLine("String could not be parsed."); >// Output: -105 try < int m = Int32.Parse("abc"); >catch (FormatException e) < Console.WriteLine(e.Message); >// Output: Input string was not in a correct format. const string inputString = "abc"; if (Int32.TryParse(inputString, out int numValue)) < Console.WriteLine(numValue); >else < Console.WriteLine($"Int32.TryParse could not parse '' to an int."); > // Output: Int32.TryParse could not parse 'abc' to an int. > >
В следующем примере показан один из подходов к анализу строки, которая, как ожидается, будет включать начальные числовые символы (включая шестнадцатеричные символы) и конечные нечисловые символы. Он назначает допустимые символы в начале новой строки перед вызовом метода TryParse. Поскольку анализируемые строки содержат небольшое количество символов, в примере вызывается метод String.Concat для назначения допустимых символов новой строке. Для большей строки можете использовать класс StringBuilder.
using System; public static class StringConversion < public static void Main() < var str = " 10FFxxx"; string numericString = string.Empty; foreach (var c in str) < // Check for numeric characters (hex in this case) or leading or trailing spaces. if ((c >= '0' && c = 'A' && char.ToUpperInvariant(c) else < break; >> if (int.TryParse(numericString, System.Globalization.NumberStyles.HexNumber, null, out int i)) < Console.WriteLine($"'' --> '' --> "); > // Output: ' 10FFxxx' --> ' 10FF' --> 4351 str = " -10FFXXX"; numericString = ""; foreach (char c in str) < // Check for numeric characters (0-9), a negative sign, or leading or trailing spaces. if ((c >= '0' && c else < break; >> if (int.TryParse(numericString, out int j)) < Console.WriteLine($"'' --> '' --> "); > // Output: ' -10FFXXX' --> ' -10' --> -10 > >
Вызов методов класса Convert
В следующей таблице перечислены некоторые методы класса Convert, которые можно использовать для преобразования строки в число.
| Числовой тип | Метод |
|---|---|
| decimal | ToDecimal(String) |
| float | ToSingle(String) |
| double | ToDouble(String) |
| short | ToInt16(String) |
| int | ToInt32(String) |
| long | ToInt64(String) |
| ushort | ToUInt16(String) |
| uint | ToUInt32(String) |
| ulong | ToUInt64(String) |
В данном примере вызывается метод Convert.ToInt32(String) для преобразования входных данных string в значение типа int. Пример перехватывает два наиболее распространенных исключения, которые могут создаваться этим методом, — FormatException и OverflowException. Если итоговое число можно увеличить, не превышая Int32.MaxValue, пример добавляет 1 к результату и отображает вывод.
using System; public class ConvertStringExample1 < static void Main(string[] args) < int numVal = -1; bool repeat = true; while (repeat) < Console.Write("Enter a number between −2,147,483,648 and +2,147,483,647 (inclusive): "); string? input = Console.ReadLine(); // ToInt32 can throw FormatException or OverflowException. try < numVal = Convert.ToInt32(input); if (numVal < Int32.MaxValue) < Console.WriteLine("The new value is ", ++numVal); > else < Console.WriteLine("numVal cannot be incremented beyond its current value"); >> catch (FormatException) < Console.WriteLine("Input string is not a sequence of digits."); >catch (OverflowException) < Console.WriteLine("The number cannot fit in an Int32."); >Console.Write("Go again? Y/N: "); string? go = Console.ReadLine(); if (go?.ToUpper() != "Y") < repeat = false; >> > > // Sample Output: // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): 473 // The new value is 474 // Go again? Y/N: y // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): 2147483647 // numVal cannot be incremented beyond its current value // Go again? Y/N: y // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): -1000 // The new value is -999 // Go again? Y/N: n
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Typecast/ru
Typecasting(приведение типов) — это концепция, позволяющая присваивать значения переменных или выражений, которые не соответствуют типу данных, переменной, фактически перекрывая систему строгой типизации Pascal.
Contents
- 1 Определение
- 1.1 Неявное приведение типов
- 1.2 Явное приведение типов
- 1.2.1 Value typecasts (приведение типа для значения)
- 1.2.2 Variable typecasts (приведение типа для переменной)
Определение
Различают два варианта приведения типов:
Неявное приведение типов
Если полный диапазон значений, которые может иметь источник, может быть сохранен целевым операндом, происходит автоматическая — то есть «неявная» — передача типа. Например, все значения типа byte могут быть сохранены в int64 . Присвоение значения типа byte для int64 работает без проблем, поскольку пропущенные нулевые биты заполняются автоматически, то есть неявно. Программист не должен вставлять дополнительный код.
Прим.перев.: иными словами, преобразование переменных с меньшим диапазоном значений в переменные с большим диапазоном значений происходит автоматически (неявное преобразование).
Явное приведение типов
Если диапазон значений источника не вписывается в диапазон целевого операнда, компилятор не скомпилирует программу, если ему не дано [указаний явно] игнорировать это.
Прим.перев.: иначе говоря, преобразование переменных с большим диапазоном значений в переменные с меньшим диапазоном значений осуществляется с помощью явного преобразования путем вызова соответствующей функции. И если значение переменной-источника не соответствует поддерживаемому диапазону значений переменной-приемника, то произойдет потеря данных.
Существует два разных варианта явного приведения типа:
Value typecasts (приведение типа для значения)
Преобразование типов осуществляется путем добавления идентификатора типа данных и заключения выражения для преобразования типов в круглые скобки, например: dataType ( expression ) . Лишние биты просто отбрасываются. Этот подход обычно используется, если есть абсолютная уверенность, что фактическое значение expression будет соответствовать ожидаемому. Иногда этот эффект также используется вместо применения оператора Mod.
Variable typecasts (приведение типа для переменной)
Такое приведение типа обрабатывает переменную, как если бы это был другой тип. Извлечение и сохранение переменной выполняется, как если бы это был указанный тип данных. Так же, как и в случае приведения типа для значения, перед типом данных добавляется идентификатор типа, а в этом случае круглые скобки окружают идентификатор переменной: dataTypeIdentifier ( variableIdentifier ) . В отличие от приведения типа для значения, приведения типа для переменной может происходить с обеих сторон присваивания.
Преобразование в сравнении с приведением типов
Преобразование типов — это упорядоченный процесс отображения значений домена в совместный домен, что может привести к возникновению исключений или ошибок времени выполнения. Это делается с помощью правильно определенных функций. Простое приведение типов, с другой стороны, это всегда грубая сила. Оно обрезает и заталкивает биты 1:1 адресату. Однако вы можете задать перегрузку оператора, переопределяя это поведение.
В некоторых случаях вы можете конвертировать значения:
В других случаях вы должны вручную выполнить явное приведение типов:
приведение типов
исходный тип данных конечный тип данных вариант преобразования типов метод qWord byte явный byte ( qWordVariableOrExpression ) qWord word явный word ( qWordVariableOrExpression ) qWord cardinal явный cardinal ( qWordVariableOrExpression ) qWord longWord явный longWord ( qWordVariableOrExpression ) longWord byte явный byte ( longWordVariableOrExpression ) longWord word явный word ( longWordVariableOrExpression ) longWord cardinal неявный оператор присваивания int64 byte явный byte ( int64variableOrExpression ) int64 shortInt явный shortInt ( int64variableOrExpression ) comp byte явный byte ( compVariableOrExpression ) comp shortInt явный shortInt ( compVariableOrExpression ) comp real явный real ( compVariableOrExpression ) Предостережение
- Явное приведение типов отключает проверку диапазона в полной строке кода.
См.также
- «Кастинг типов (компьютерное программирование)» в русской Википедии
- § “value typecasts” в справочном руководстве FreePascal
- § “variable typecasts” в справочном руководстве FreePascal
- § “ unaligned typecasts” в справочном руководстве FreePascal
- Перегрузка операторов (особая группа операторов присваивания и § «маршрутизация»)
Как преобразовать string в int pascal
Нужно в Turbo pascal преобразовать массив, состаящий из слов, в одну строку.
Вроде примитив, а сделать не получается.
Помогите пожалуйста.__________________
—>ICQ 447115<-- Регистрация: 15.05.2005 Адрес: Питер Сообщения: 1 194ну так делаешь цикл
for i:=1 to n do begin
str := str + mass[i];
end;
Я точно не помню — в Паскале строки можно складывать или нет. Возможно вместо + там . или |, но вроде +__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
::VIP::
Звезда первого сезона
Молчун-2004
Регистрация: 24.08.2002
Сообщения: 1 575
The_naked
Плюс там юзается. Немножко дополню, как бы я это делал:function arr2str (inp: array of string): string; var i: integer; s: string; begin s := ''; for i := 1 to sizeof (inp) div sizeof (string) do begin if s <> '' then s := s + ' '; s := s + inp[i - 1]; end; arr2str := s; end; var str: array [1..3] of string; begin str[1] := 'qwerty'; str[2] := 'asdf'; str[3] := 'zx'; writeln (arr2str (str)); end.
Можно отсюда выковырнуть функцию arr2str и юзать, где надо.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы!
Последний раз редактировалось Ghost; 04.05.2006 в 18:09 . Причина: склероZzz.
Регистрация: 13.05.2004
Адрес: NetWorK
Сообщения: 294Не знаю почему, но вариантThe_naked
я пробовал сам, не работало.
А вот Ghost подкинул полностью удовлетворяющую меня функцию, хотя алгорит впринципе один и тот же.
Спасибо! Проблему решил!