Ver la Versión Completa : 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:
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!
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.