Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Quitar todas las letras de una cadena

La siguiente función quita de la cadena que se pasa como parámetro todas las letras que esta contenga:

Código Delphi [-]
function QuitarLetras(const cadena: string) : string;
var
  i: integer;
begin
  for i := 1 to Length(cadena) do
    if cadena[i] in ['0'..'9'] then
      Result := Result + cadena[i];
end;
Responder Con Cita
  #2  
Antiguo 15-07-2021
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.494
Poder: 21
MAXIUM Va camino a la fama
Hola Dec, gracias por tu truco.

Lo use en un ciclo enviando los datos a esa función, pero el Result, mantenía todos los valores anteriores. No le encontré lógica de qué porque sucedía. Así que inicialice Result con el valor '';
Responder Con Cita
  #3  
Antiguo 16-07-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Hola, una pequeña actualización de este código usando expresiones regulares sería así:

Código Delphi [-]
//Agregar System.RegularExpressions en los uses

function QuitarLetras(const S: string) : string;
begin
  Result := TRegEx.Replace(S, '([a-z])*', '', [roIgnoreCase, roMultiLine]);
end;
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #4  
Antiguo 21-07-2021
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.494
Poder: 21
MAXIUM Va camino a la fama
Muchas gracias. Me has abierto un mundo

Pero creo que la expresión correcta seria la siguiente:
Código Delphi [-]
//Agregar System.RegularExpressions en los uses

function QuitarLetras(const S: string) : string;
begin
  Result := TRegEx.Replace(S, '[^1234567890]', '', [roIgnoreCase, roMultiLine]);
end;

Por otra parte ¿por qué S es declarada constante?
Responder Con Cita
  #5  
Antiguo 22-07-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Cita:
Empezado por MAXIUM Ver Mensaje
.. Creo que la expresión correcta seria la siguiente:
Código Delphi [-]
//Agregar System.RegularExpressions en los uses

function QuitarLetras(const S: string) : string;
begin
  Result := TRegEx.Replace(S, '[^1234567890]', '', [roIgnoreCase, roMultiLine]);
end;
Ambas expresiones terminan entregando el mismo resultado. Aunque, esta que propones es mas eficiente!

Métricas de Regex101:

Expresión: '([a-z])*
Pasos: 16.317
Tiempo: 36.7 ms
Link: https://regex101.com/r/HveDfl/1

Expresión: [^1234567890]
Pasos: 5.308
Tiempo: 28.6 ms
Link: https://regex101.com/r/N5WzUR/1

Pero si la modificamos un poco. Se obtiene una mas corta que reduce un poco el tiempo:

Expresión: [^0-9]
Pasos: 5.308
Tiempo: 22.6 ms
Link: https://regex101.com/r/nBVQg9/1

Código Delphi [-]
//Agregar System.RegularExpressions en los uses

function QuitarLetras(const S: string) : string;
begin
  Result := TRegEx.Replace(S, '[^0-9]', '', [roIgnoreCase, roMultiLine]);
end;

Cita:
Empezado por MAXIUM Ver Mensaje
Por otra parte ¿por qué S es declarada constante?
¡Bueno! En realidad lo copié del primer ejemplo, pero según la documentación. Cuando se trabaja con parámetros constantes de tipo string, permite al compilador optimizar el código.

Cita:
Constant Parameters
A constant (const) parameter is like a local constant or read-only variable. Constant parameters are similar to value parameters, except that you cannot assign a value to a constant parameter within the body of a procedure or function, nor can you pass one as a var parameter to another routine. (But when you pass an object reference as a constant parameter, you can still modify the object's properties.)

Using const allows the compiler to optimize code for structured - and string-type parameters. It also provides a safeguard against unintentionally passing a parameter by reference to another routine.

Here, for example, is the header for the CompareStr function in the SysUtils unit:

function CompareStr(const S1, S2: string): Integer;
Because S1 and S2 are not modified in the body of CompareStr, they can be declared as constant parameters
http://docwiki.embarcadero.com/RADSt...eters_(Delphi)
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #6  
Antiguo 22-07-2021
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.494
Poder: 21
MAXIUM Va camino a la fama
En constante aprendizaje. Gracias una vez más
Responder Con Cita
  #7  
Antiguo 22-07-2021
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por movorack Ver Mensaje
Ambas expresiones terminan entregando el mismo resultado.
No.

La primera acepta N-caracteres y la segunda solo acepta dígitos enteros. Que es distinto de "Quitar todas las letras de una cadena".

PRO TIP: Es MUCHO mejor validar por lo que es valido que intentar definir lo que es invalido.

Y: "todas las letras" ahi solo seria ALGUNAS del ASCII, no TODAS las letras. Son un montón!

P.D: Validaciones incompletas es uno de mis dolores de cabeza...

P.D: Se que suena algo pedante, pero es importante que lo que dice la "documentación" y lo que expresa el código concuerden, aun si en algunos escenarios parece que es lo mismo!
__________________
El malabarista.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:53:41.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi