PDA

Ver la Versión Completa : Extraer números en una string alfanumérica


Tonio
19-10-2003, 23:15:37
Tengo un RichEdit con un texto dividido en capítulos y estos en párrafos, los cuales están numerados, como puedo pasar, los números de párrafo, a una variable.
El número de párrafos por capitulo pueden ser hasta 150 el máximo y 10 el mínimo.
Con Cadena[i] saco hasta 9, pero si el párrafo es el número 10, solamente me saca el 0, es decir la última cifra del número de párrafo.
He hecho varios intentos, cuando hago un stop en el bucle, con un showmessage, por ejemplo, si sale el 10, pero sin el stop, nada de nada.
¿Qué debo hacer?
Gracias de antemano.
Un saludo.
Tonio.

marcoszorrilla
20-10-2003, 08:23:37
Hola Tonio: No sé que código utilizas, pero una aproximación puede ser esta,
1º. Busco un número
2º. Cuando lo encuentro lo guardo en una variable.
3º.-Busco a ver si el siguiente caracter sigue siendo número, si es así lo acumulo en la variable de tipo caracter.
4º.- Cuando no encuentre más números doy por finalizado el actual y paso al siguiente.

Un saludo, espero te sirva la idea.

roman
20-10-2003, 17:23:09
Serviría si nos especificaras más acerca de cómo está almacenado el número de párrafo (al principio de una línea, en una línea aparte, etc) Quizá te sirva el procedimiento Val:

Val(S, V, Code)

que convierte una cadena S en un entero V. Si S no es un entero entonces Code indicará el primer caracter que no es número y V contendrá el número hasta donde haya podido convertirse. Así, por ejemplo, si el número de párrafo está al comienzo de una línea, digamos

Linea = '23 Mañana comienzo a trabajar...'

Val(Linea, V, Code)

te pondrá en V el valor 23 y en Code el valor 3.

// Saludos

gatosoft
21-10-2003, 17:30:30
Todo seria mas facil si se tuviera un separador estandar (y preferiblemente no tan comun) entre los números y los capitulos. Por ejemplo:

1.) Intriducción

el separdor es un punto y un paréntesis cerrado, podria ser simplenete el paréntesis... o un doble guon asi:

1--Introducción

Para esto, yo utilizaria la siguiente función:


Function get_NumeroCapitulo(pCadena:String; pSepardor:string):Integer
var i, vPos:Integer;
vCadena:string;
ves_numerico:Boolean;
Begin
Result:=-1;
vPos:=Pos(pSeparador,pCadena);
if vPos>0 then
begin
// si existe el caracter separador,
// verifica si hay un número a la izquierda.

vCadena:=Trim(Copy(pCadena,1,vPos-1));
if vCadena:='' then
begin
ves_numerico:=True;
//Comienza el ciclo para
//verificar si es numerico
For i:=1 to length(vCadena) do
begin
if not (vCadena[i] in ['0'..'9']) then
begin
ves_numerico:=False;
Break;
end;//if
end; //for i

if ves_numerico then
Result:=StrToint(vCadena);
end; //if vCadena
end; //vpos
end;

Tonio
23-10-2003, 10:22:04
Gracias a los tres por vuestras respuestas.
La de Roman, me serviría si también pudiera ver los números a mitad de string, ya que puede haber dos números en la misma linea, es decir puede ser:
23 las cosas de aquí. 24 las cosas del otro lado. Siguiendo tu solución solamente me cogería el 23.
En cuanto a la de Gatosoft, había comenzado a hacer algo parecido, pero me ha ayudado mucho.
Gracias de nuevo.
Un saludo.
Tonio.