Ответ 1
Строки основаны на 1:
if not (myString[1] in ['0'..'9']) then // Do something
Я пытаюсь выяснить способ проверки первого элемента строки, если это число или нет.
if not(myString[0] in [0..9]) then //Do something
Проблема в том, что я получаю сообщение об ошибке "Элемент 0 недоступен - используйте" Длина "или" Установить длину "
Еще один способ пришел ко мне из моего C-like exprieince - преобразовать первый элемент строки в char и проверить char, но нет никакой разницы в ошибках компиляции.
if not(char(myString[0]) in [0..9]) then //Do something
Как это сделать?
Строки основаны на 1:
if not (myString[1] in ['0'..'9']) then // Do something
Pascal и Delphi индексируют строку из 1. Это наследие от времени, когда нулевой байт содержал длину, а в следующем 255 (индекс от 1 до 255) содержались фактические символы.
Джоэл Спольский написал неплохую статью о проблемах с строкой:
http://www.joelonsoftware.com/articles/fog0000000319.html
Строки Delphi используют индекс на основе 1, поэтому просто перепишите на
if not(myString[1] in ['0'..'9']) then //Do something
Также обратите внимание на кавычки вокруг 0..9
, иначе вы бы сравнивали символы с целыми числами.
Мы должны иметь в виду некоторые вещи:
AnsiString
(1-байтная за char) и WideString
в новых версиях (2 байта на char).AnsiChar
, но не поддерживает набор WideChar
.Итак, если мы хотим написать код, совместимый со всеми версиями Delphi, то это должно быть примерно так:
if (myString[Low(myString)]>='0') and (myString[Low(myString)]<='9') then
// Do something
if not (myString [0] в [0..9]), то//Делаем что-то
Если вы используете Delphi 2009, класс TCharacter в Character.pas имеет такие функции, как IsDigit, чтобы упростить эти операции.
Как только вы исправите индексирование, конечно.:)
Самый простой способ проверить, является ли первый символ строки целочисленным, а затем отправить:
var
iResult : integer;
begin
if TryStrToInt( mySTring[1], iResult) then
begin
// handle number logic here iResult = number
end
else
begin
// handle non number logic here
end;
end;
Я использую функцию утилиты для проверки всей строки:
function IsNumeric(const Value: string): Boolean;
var
i: Integer;
begin
Result := True;
for i := 1 to Length(Value) do
if not (Value[i] in ['0'..'9','.','+','-']) then
begin
Result := False;
Break;
end;
end;
Вышеприведенный код предназначен для версий Delphi до 2007 года. В 2007 и 2009 годах вы можете изменить целочисленную переменную я на символ c и использовать вместо c значение Value.
Чтобы проверить только целые числа, удалите '.' из набора символов для тестирования.
Это неверно. Строки ISO и старый Pascal также начинались с одного. Это просто общая конвенция, и afaik s [0] вещь является результатом того, что она является вакантной и дешевой для кодирования в интерпретаторе байт-кода UCSD. Но последний бит до моего времени, так что только мои догадки.
Это связано с тем, что способность Pascal имеет произвольную верхнюю и нижнюю границы, что обеспечивает большее количество типов доступа к массивам.
Действительно, старые строки Паскаля (до начала восьмидесятых) были еще хуже, чем C-бит. Были использованы множественные соглашения, но все они были основаны на статических массивах (например, на раннем этапе C), но они обычно были заполнены пробелами, поэтому вы сканировали с конца до окончания пробелов.
(удалено прежний тег, поскольку на основании 1 не является устаревшим. Доступ к s [0] как длина IS является устаревшим, но это не то, о чем идет речь)
Foreach element in strName
if not element in [0-9] then
do something
else
element is a digit
end if
Не забудьте цитату между цифрами.
С более поздними обновлениями для мобильного кода Delphi индекс нижней строки изменился с 0 на 1. Когда вы компилируете старые программы, они скомпилируются и запускаются правильно, используя начальный индекс 0. Программы, созданные с более поздней IDE, вызывают ошибку. Когда у вас есть смеси, жизнь становится сложной!
Было бы неплохо иметь более старую программу и сообщать IDE, что вы хотите ее обновить (возможно, это исправит другие вещи, например, шрифты, получающие скремблирование при ответе на телефонный звонок!), но это будьте добры, чтобы добиться согласованности!