Как получить первый элемент в строке? - PullRequest
16 голосов
/ 17 июля 2009

Я пытаюсь найти способ проверить первый элемент строки, является ли он числом или нет.

if not(myString[0] in [0..9]) then //Do something

Проблема в том, что я получаю ошибку «Элемент 0 недоступен - используйте« Длина »или« SetLength »

Другой способ пришел в мою голову от моего C-подобного опыта - преобразовать первый элемент строки в char и проверить его, но в ошибках компиляции нет никакой разницы.

if not(char(myString[0]) in [0..9]) then //Do something

Как мне это сделать?

Ответы [ 10 ]

39 голосов
/ 17 июля 2009

Строки основаны на 1:

if not (myString[1] in ['0'..'9']) then // Do something
16 голосов
/ 17 июля 2009

Строка индексов Pascal и Delphi из 1. Это наследие от времени, когда нулевой байт содержал длину, а следующие 255 (с 1 по 255) содержали действительные символы. Джоэл Спольски написал неплохую статью о проблемах со строкой:
http://www.joelonsoftware.com/articles/fog0000000319.html

8 голосов
/ 17 июля 2009

В строках Delphi используется индекс на основе 1, поэтому просто переписать в

if not(myString[1] in ['0'..'9']) then //Do something

Также обратите внимание на кавычки вокруг 0..9, иначе вы будете сравнивать символы с целыми числами.

5 голосов
/ 03 сентября 2014

Мы должны помнить о некоторых вещах:

  1. String в Delphi имеет 0 для мобильных платформ и 1 для Windows.
  2. Строка в старых версиях Delphi имеет значение AnsiString (1 байт на символ) и WideString в новых версиях (2 байта на символ).
  3. Delphi поддерживает набор AnsiChar, но не поддерживает набор WideChar.

Так что, если мы хотим написать код, совместимый со всеми версиями Delphi, то он должен выглядеть примерно так:

if (myString[Low(myString)]>='0') and (myString[Low(myString)]<='9') then
  // Do something
1 голос
/ 17 июня 2015

При последующих обновлениях мобильного кода Delphi индекс нижней строки изменился с 0 на 1. Когда вы компилируете более старые программы, они компилируются и работают правильно, используя 0 начального индекса. Программы, созданные с использованием более поздней IDE, выдают ошибку. Когда у вас есть смеси, жизнь становится сложной!

Было бы хорошо иметь возможность взять более старую программу и сообщить IDE, что вы хотите, чтобы она была обновлена ​​(возможно, это исправило бы другие вещи, такие как шифрование шрифтов при ответе на телефонный звонок!), Но это будь хорош, чтобы все было согласованно!

1 голос
/ 17 июля 2009

если нет (myString [0] в [0..9]), то // сделать что-то

Если вы используете Delphi 2009, класс TCharacter в Character.pas имеет функции, подобные IsDigit, для упрощения операций такого типа.

Как только вы исправите индексацию, конечно. :)

0 голосов
/ 10 августа 2014
Foreach element in strName
  if not element in [0-9] then
     do something 
  else
    element is a digit
end if

Не забудьте про кавычку между цифрами.

0 голосов
/ 17 июля 2009

Это неверно. Строки ISO и более ранние версии Pascal также начинаются с одного. Это просто общее соглашение, и на самом деле s [0] является результатом того, что он вакантный и дешевый для кодирования в интерпретаторе байт-кода UCSD. Но этот последний бит до моего времени, так что только мои догадки.

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

Действительно старые строки Паскаля (до начала восьмидесятых) были даже хуже, чем струны Си. Использовалось несколько соглашений, но все они основывались на статических массивах (например, ранний C), но они, как правило, были дополнены пробелами, поэтому вы должны были сканировать от конца до конца пробелов.

(убрал унаследованный тег, поскольку основание на 1 не является унаследованным. Доступ к s [0] как длине является унаследованным, но вопрос не в этом)

0 голосов
/ 17 июля 2009

Я использую служебную функцию для проверки всей строки:

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 годах вы могли изменить целочисленную переменную i на символ c и использовать вместо нее значение c в Value.

Чтобы проверить только целые числа, удалите '.' из набора символов для проверки.

0 голосов
/ 17 июля 2009

Самый простой способ проверить, является ли первый символ строки целым числом, а затем отправить:

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;    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...