2008-10-27 28 views
6

¿Cuál es la forma correcta de verificar si un valor es una fecha/número en Delphi?¿Cuál es la forma correcta de verificar si un valor es una fecha/número en Delphi

Sé que otros idiomas tienen funciones como isDate e isNaN, pero ¿cuál es el equivalente de Delphi? en el momento en que tengo esta

function isNumeric(s1:string):boolean; 
begin 
    // will throw exception if its not a number 
    // there must be a better way to do this!! 
    try 
    StrTofloat(s1); 
     result := TRUE ; 
    except 
     result := FALSE; 
     end; 
end; 

Pero excepciones que lanzan puedo ser bueno, y eso hace que la depuración duro como sigo viendo el diálogo excepción cada vez que el código se llama.

Respuesta

14

Para enteros, se puede utilizar para comprobar TryStrToInt y convertir sin excepciones que lanzan:

function TryStrToInt(const s: string; out i : integer): boolean; 

No estoy absolutamente seguro de que es un equivalente completo para los flotadores, sin embargo, por lo que puede que tenga que utilizar StrToFloat () y acepta la posibilidad de una TFormatException.

+1

Sí, también hay TryStrToDate y TryStrToFloat y mucho más. Compruebe SysUtils. –

+0

Gracias, Gamecat. Han pasado algunos años;) – Alan

+0

Los documentos de CodeGear están disponibles en línea si necesita más ayuda. http://docs.codegear.com/ – stukelly

2

Hay una familia de funciones como TryStrToFloat,etc. que hacen eso. Por cierto, StrToFloat y otros usan las versiones "Probar" internamente antes de generar excepciones.

2

En primer lugar, la función StrToFloatDef es una alternativa útil aquí si desea permanecer en el idioma tal como se entregó la caja.

Sin embargo, su mejor opción es implementar las bibliotecas de códigos JEDI (http://www.delphi-jedi.org/) y utilizar la función StrIsNumber desde allí.

JEDI es de código abierto, muy útil en muchos sentidos, y casi imprescindible de todos modos.

0

PUEDE desactivar las molestas excepciones que no desea marcando la casilla "ignorar esta excepción" que aparece. Las futuras excepciones se ignorarán para esa clase de excepción. Para comenzar a preguntar de nuevo, solo vaya a Opciones | Opciones de depurador y desmarque las que está ignorando.

+0

Creo que este es un camino increíblemente peligroso, siempre quieres saber sobre tus excepciones, a menos que haya una muy buena razón, y la conversión de tipo no es una. La única vez que lo he hecho es con los archivos DLL MS OpenGl que arrojan una excepción de conocimiento y que también tienen. – Cruachan

+0

Er, está bastante claro que skamradt estaba hablando de la notificación de excepciones del depurador integrado (tenga en cuenta la referencia a "Opciones | Opciones del depurador"). Eso solo significa que el depurador no los atrapará, y la aplicación los manejará. – Argalatyr

+0

Exactamente.Muy útil cuando tiene una excepción que está siendo generada por una llamada API que está manejando correctamente en el código y que se llama en un bucle con muchas iteraciones. Tener el depurador ignorarlo es mucho mejor que usar la tecla f9. – skamradt

2

La captura de excepciones es muy lenta. Si planea usar dicha función repetidamente en sucesión rápida, como al validar campos durante la importación de un archivo, podría valer la pena desplegar su propia función que hace una verificación de nivel de carácter simple antes de caer en un bloque try/except. He utilizado algo similar anteriormente con un gran aumento de rendimiento al analizar grandes cantidades de datos que no estaban en el formato correcto.

 
function IsNumeric(aValue : string): boolean; 
var 
    i : integer; 
begin 
    result := false; 
    for i := 1 to Length(aValue) do 
    if (NOT (aValue[i] in ['0'..'9', '.', '-', '+', 'E', 'e'])) then 
     exit; 
    try 
    StrToFloat(aValue); 
    result := true; 
    except 
    end; 
end; 

Obviamente, esto puede no ser perfecto, y tiene la limitación de valores codificados en él. Depende completamente de tus necesidades, esto fue solo algo simple que funcionó bien para un proceso interno.

Cuestiones relacionadas