Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Quitar todas las letras de una cadena (https://www.clubdelphi.com/foros/showthread.php?t=80420)

dec 07-06-2006 21:06:12

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;

MAXIUM 15-07-2021 21:27:30

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 '';

movorack 16-07-2021 16:21:20

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;

MAXIUM 21-07-2021 23:34:25

Muchas gracias. Me has abierto un mundo :eek:

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? :confused:

movorack 22-07-2021 00:08:00

Cita:

Empezado por MAXIUM (Mensaje 542006)
.. 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 (Mensaje 542006)
Por otra parte ¿por qué S es declarada constante? :confused:

¡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)

MAXIUM 22-07-2021 01:12:57

En constante aprendizaje. Gracias una vez más

mamcx 22-07-2021 04:47:17

Cita:

Empezado por movorack (Mensaje 542007)
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!


La franja horaria es GMT +2. Ahora son las 22:33:18.

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