2009-07-17 16 views
13

Estoy tratando de encontrar una manera de verificar el primer elemento de una cuerda si es un número o no.¿Cómo obtener el primer elemento en una cadena?

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

El problema es que me da un error "elemento 0 inaccesibles - uso 'Longitud' o 'SetLength"

Otra forma llegó a la cabeza de mi exprieince similar a C - convertir el primer elemento de la cadena para char y comprobar el char, pero no hay diferencia en los errores de compilación.

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

¿Cómo puedo lograrlo?

+0

BTW: el tipo de retorno de la expresión myString [1] ya es un Char, por lo que un molde explícito no sirve aquí –

Respuesta

35

Las cadenas son 1-basan:

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

47 segundos ... maldición ...;) –

+0

Solo un problema ahora "tipos incompatibles - cadena y entero ". Si utilizo StrToInt y la cadena no es un número entero, se lanzará una excepción y toda esa comprobación es inútil. ¿Podría sugerirme una forma mejor? +1 por cierto. :) –

+2

John, usa TryStrToInt luego. – Pauk

8

cadenas Delphi usan un índice basado en 1, por lo que sólo reescribir a

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

Asimismo, tomamos nota de las citas de todo el 0..9, de lo contrario lo haría estar comparando personajes con enteros.

15

Pascal y Delphi indexa una cadena de 1. Este es un legado desde el tiempo en que el byte cero contenía la longitud, mientras que el siguiente 255 (índice de 1 a 255) contenía caracteres reales. Joel Spolsky escribió muy buen artículo sobre temas de cadena:
http://www.joelonsoftware.com/articles/fog0000000319.html

+0

+1 para explicar * por qué * están basados ​​en 1 –

+0

El artículo "Spolsky" habla sobre la implementación de cadenas de Pascal en C sin ningún tipo de compatibilidad con el compilador. Los problemas son irrelevantes para los idiomas que tienen soporte para ello. –

+0

@Marco van de Voort: me temo que te perdiste por completo el objetivo del artículo de Joel. – smok1

0

si no (miCadena [0] en [0..9]) entonces // Hacer algo

Si eres utilizando Delphi 2009, la clase TCharacter en Character.pas tiene funciones como IsDigit para ayudar a simplificar este tipo de operaciones.

Una vez que arregle la indexación, por supuesto. :)

+2

La conversión a Char() no es necesaria, ya que una cadena está compuesta de caracteres y se puede acceder directamente a ellos. Además, su comparación sería incorrecta de todos modos, como Char ('0') es decimal 48 (hex 30), y por lo tanto no caería entre 0 y 9. –

0

La forma más sencilla de comprobar para ver si el primer carácter de la cadena es un número entero, y luego el envío:

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;  
+1

No, no creo que sea la manera más simple. John tenía la idea correcta, pero estaba buscando en la oscuridad la sintaxis adecuada. –

+0

Es cierto, pero si quería actuar sobre el valor, entonces requería usar StrtoInt. Si usa TryStrToInt, no solo puede verificar si es un número, entonces tiene el número para usar. – skamradt

0

Puedo utilizar una función de utilidad para probar la cadena completa:

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; 

El código anterior es para las versiones de Delphi anteriores a 2007. En 2007 y 2009, puede cambiar la variable entera i por un carácter c, y usar para c en Valor en su lugar.

Para probar solo los enteros, elimine el '.' del conjunto de personajes para probar en contra.

0

Esto es incorrecto. Las cadenas ISO y Pascal's anteriores también comenzaron en uno. Es solo una convención general, y una cosa falsa [s] es el resultado de que está vacante, y es barato codificar en el intérprete de códigos de bytes de UCSD. Pero eso último es antes de mi tiempo, así que solo estoy adivinando.

Resulta de la capacidad de Pascal de tener límites superiores e inferiores arbitrarios, lo que proporciona más matrices de acceso de seguridad de tipo.

Cuerdas de Pascal realmente antiguas (hasta principios de los ochenta) eran incluso peores que las de C por cierto.Se usaron varias convenciones, pero todas se basaban en matrices estáticas (como en la versión C inicial), pero normalmente eran espaciadas, por lo que había escaneado desde el final hasta que los espacios terminaban.

(eliminado la etiqueta de legado, ya que al estar basado en 1 no es legado. Accediendo s [0] como la longitud es el legado, pero eso no es lo que la pregunta se refiere a)

0
Foreach element in strName 
    if not element in [0-9] then 
    do something 
    else 
    element is a digit 
end if 

No olvide el Cita entre el número de dígitos.

4

Debemos tener en cuenta algunas cosas:

  1. para cuerdas en Delphi es 0-Basados ​​para plataformas móviles y 1-basamos para Windows.
  2. Cadena en versiones anteriores de Delphi es AnsiString (1 byte por char) y WideString en versiones nuevas (2 bytes por char).
  3. Delphi admite el conjunto de AnsiChar, pero no es compatible con el conjunto de WideChar.

lo tanto, si queremos escribir un código compatible con todas las versiones de Delphi, entonces debería ser algo como esto:

if (myString[Low(myString)]>='0') and (myString[Low(myString)]<='9') then 
    // Do something 
0

Con las actualizaciones posteriores al código móvil Delphi, el índice de secuencia inferior cambió de 0 a 1. Cuando compila programas más antiguos, se compilan y se ejecutan correctamente utilizando el índice inicial 0. Los programas creados con el IDE posterior producen un error. Cuando tienes mezclas, ¡la vida se vuelve compleja!

Sería bueno poder tomar un programa anterior y decirle al IDE que desea actualizarlo (¡quizás esto podría arreglar otras cosas, como que las fuentes se codifiquen al responder una llamada telefónica!) Pero sería bueno hacer que las cosas sean consistentes!

Cuestiones relacionadas