2012-05-31 33 views
7

Me gustaría saber cómo puedo eliminar números de una Cadena. Intento utilizar StringReplace y no sé cómo decirle a la función que deseo reemplazar números.Borrar números de una Cadena

Esto es lo que he intentado:

StringReplace(mString, [0..9], '', [rfReplaceAll, rfIgnoreCase]); 
+0

Bueno, Delphi XE y hasta soporta exresión regular que se puede utilizar para reemplazar cadenas. Está en las unidades RegularExpressions y RegularExpressionsCore – Hendra

+0

Bien, gracias, lo echaré un vistazo. – CharleyXIV

Respuesta

11

Simple pero efectivo. Se puede optimizar, pero debe obtener lo que necesita como un comienzo:

function RemoveNumbers(const aString: string): string; 
var 
    C: Char; 
begin 
    Result := ''; 
    for C in aString do begin 
     if not CharInSet(C, ['0'..'9']) then 
     begin 
     Result := Result + C; 
     end; 
    end; 
end; 
+2

Esta debe ser la forma más fácil de hacerlo, y el código más corto. –

+0

De acuerdo. Aunque soy un gran admirador de las expresiones regulares, la solución de Nick a este problema en particular es mucho más rápida. ¡Algo más complicado y me gustaría ir con RegEx en un abrir y cerrar de ojos! –

-1

StringReplace no acepta un conjunto como el segundo argumento. Tal vez alguien va a tener un enfoque más adecuado, pero esto funciona:

StringReplace(mString, '0', '', [rfReplaceAll, rfIgnoreCase]); 
StringReplace(mString, '1', '', [rfReplaceAll, rfIgnoreCase]);  
StringReplace(mString, '2', '', [rfReplaceAll, rfIgnoreCase]); 

etc.

+4

¡Yuck! ¿Puedes decir 'DRY' (No repetir)? Lo siento, pero tengo que descartar esto como una * horrible solución a la pregunta. –

+0

De acuerdo ... podría al menos repetir .. para i: = 0 a 9 hacer StringReplace (mString, I, '', [rfReplaceAll, rfIgnoreCase]); –

+0

¡Oye, Ken, no me molestes! :-) "Horrible?" Sí, un bucle for tiene ventajas. Pero, a veces, agregar complejidad agrega errores. El código de John (a menos que lo edite después de haber publicado esto) es un buen ejemplo: primero, no se puede compilar. Suponiendo que pretendía que "yo" fuera un número entero, el código correcto es un poco complicado. El segundo parámetro debe ser chr (ord ('0') + i), ¿no? O el for-loop debería ser para ch: = chr ('0') a chr ('9'). Ambos agregan un poco de complejidad y realmente no responden su pregunta directamente, que es cómo usar StringReplace. Pensé que el OP podría revisar fácilmente el código como sugieres. – RobertFrank

1

Bueno, yo estaba cansado de buscar ya construir funciones por lo que he creado mi propia:

function RemoveNumbers(const AValue: string): string; 
    var 
     iCar : Integer; 
     mBuffer : string; 
    begin 
     mBuffer := AValue; 

     for iCar := Length(mBuffer) downto 1 do 
     begin 
     if (mBuffer[iCar] in ['0'..'9']) then 
      Delete(mBuffer,iCar,1); 
     end; 
     Result := mBuffer; 
    end; 
+4

Tu función fallará, el contador de bucle for se almacena en caché y estás * acortando * tu cadena en el bucle. –

+2

Pero podría resolver este problema invirtiendo el orden de las eliminaciones (usando 'for ... downto' en su lugar). Solo recuerde que los caracteres en 'cadena' están indexados de' 1', no de '0'. –

+0

Bien gracias, he editado mi código. – CharleyXIV

4

Bastante rápida en la versión in place.

procedure RemoveDigits(var s: string); 
var 
    i, j: Integer; 
    pc: PChar; 
begin 
    j := 0; 
    pc := PChar(@s[1]); 
    for i := 0 to Length(s) - 1 do 
    if pc[i] in ['0'..'9'] then 
       //if CharInSet(pc[i], ['0'..'9']) for Unicode version 
     Inc(j) 
    else 
     pc[i - j] := pc[i]; 
    SetLength(s, Length(s) - j); 
end; 
+1

+1 para una sustitución en el lugar, si la cadena original era grande, este tipo de método es mucho más eficiente con la memoria. cualquier str: = str +? u otro método que genere cadenas temporales puede acumular rápidamente una gran huella de memoria que he comido cuando las rutinas simples de conversión (hexadecimal a la papelera, base64, etc.) se usan en conjuntos de datos de gran tamaño (algunos megas) – Dampsquid

4

Esto tiene la misma salida que la versión de Nick, pero esto es más de 3 veces más rápido con cadenas cortas. Cuanto más largo sea el texto, mayor será la diferencia.

function RemoveNumbers2(const aString: string): string; 
var 
    C:Char; Index:Integer; 
begin 
    Result := ''; 
    SetLength(Result, Length(aString)); 
    Index := 1; 
    for C in aString do 
    if not CharInSet(C, ['0' .. '9']) then 
    begin 
     Result[Index] := C; 
     Inc(Index); 
    end; 
    SetLength(Result, Index-1); 
end; 

No malgastes preciosos ciclos de CPU si no tienes que hacerlo.

0

uso de este

function RemoveNonAlpha(srcStr : string) : string; 
const 
CHARS = ['0'..'9']; 
var i : integer; 
begin 
result:=''; 
for i:=0 to length(srcStr) do 
if (srcstr[i] in CHARS) then 
result:=result+srcStr[i]; 
end ; 

se le puede llamar como esto

edit2.text: = RemoveNonAlpha (Edit1.Text);

Cuestiones relacionadas