PDA

Ver la Versión Completa : Quitar todas las letras de una cadena


dec
07-06-2006, 21:06:12
La siguiente función quita de la cadena que se pasa como parámetro todas las letras que esta contenga:


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í:


//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:

//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
.. Creo que la expresión correcta seria la siguiente:

//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


//Agregar System.RegularExpressions en los uses

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


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.


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/RADStudio/Sydney/en/Parameters_(Delphi)

MAXIUM
22-07-2021, 01:12:57
En constante aprendizaje. Gracias una vez más

mamcx
22-07-2021, 04:47:17
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!