Newsgroup: it.comp.lang.delphi
Titolo: Smembramento stringa

Ho bisogno di estrarre da una stringa tipo "7,10,12,15" i vari numeri.
So che il carattere separatore sarà sempre lo stesso, come posso fare?
C'è un modo più immediato senza dovermi scandagliare tutta la stringa
carattere per carattere?
Grazie a tutti di cuore e alla prossima.

>Ho bisogno di estrarre da una stringa tipo "7,10,12,15" i vari numeri.
hai bisogno della funzione StrTok che in Delphi non c'e', ma e' facile
da implementare.
Guarda sotto.
Ciao
Duilio
var
   s:string;	
begin
   s:='7,10,12,15';
   s:=StrTok(s,',','error');	{s='7'}		{nota che la 1a (sola)
volta passi s come 1o parametro}
   s:=StrTok('',',','error');	{s='10'}              {per le volte
successive,passi '' (blank)}
   s:=StrTok('',',','error');	{s='12'}
   s:=StrTok('',',','error');	{s='15'}
   s:=StrTok('',',','error');	{s='error'}
end;
in generale puoi scrivere
var
   s:string;	
begin
   s:='7,10,12,15';
   s:=StrTok(s,',','error');	{s='7'}		{nota che la 1a (sola)
volta passi s come 1o parametro}
   while s<>'error' do
   begin
      s:=StrTok('',',','error');	
     {qui fai qualcosa}
   end;
end;
function StrTok(Text,Token,Error:string):string;
const
   LftTxt:string='';
var
   i:integer;
   s:string;
begin
   result:=Error;
   if length(Text)>0 then
   begin
      s:=Text;
      LftTxt:=s;
   end
   else if length(LftTxt)>0 then
      s:=LftTxt
   else
      exit;
   i:=Pos(Token,s);
   if i=0 then
   begin
      result:=LftTxt;
      LftTxt:='';
   end
   else
   begin
      result:=Copy(s,1,i-1);
      LftTxt:=Copy(s,i+length(Token),length(s)+1-i-length(Token));
   end;
end;
Ciao
Duilio

carattere per carattere?
Caricala in una TStringList assegnandola alla proprietà CommaText; dopo
di che ciascun campo va in una string diversa.
var i, num: integer;
    aSl: tstringList;
begin
  aSl := TStringList.Create;
  try
    aSl.CommaText := String2BeParsed;
    for i := 0 to aSl.Count-1 do begin
      try
	num := StrToInt(aSl[i]);
        // use num
      except
        ; // handle EConvertError
      end;
    end;  
  finally
  end;
end;
Saluti
Paolo Arosio

carattere per carattere?
Magari aggiungici dei controlli d'errore piu' rigorosi :)
// ---- start of code
type TIntegerExtractor = class
                           private
                             FSeparator   : Char ;
                             FString      : String ;
                             FEndOfString : Boolean ;
                             FErrorFlag   : Boolean ;
                           public
                             constructor Create( Separator : Char ;
                                                 S : String ) ;
                             function NextInteger : Integer ;
                             property EoS : Boolean read FEndOfString
;
                             property Error : Boolean read FErrorFlag
;
                         end ;
constructor TIntegerExtractor.Create ;
begin
  FSeparator := Separator ;
  FString := S ;
  FEndOfString := false ;
  FErrorFlag := false ;
end ;
function TIntegerExtractor.NextInteger : Integer ;
var P : Integer ;
    NumeroStr : String ;
begin
  P := Pos( FSeparator, FString ) ;
  if ( P > 0 ) then
  begin
    NumeroStr := Copy( FString, 1, P-1 ) ;
    Delete( FString, 1, P )
  end
  else
  begin
    NumeroStr := FString ;
    FString := '' ;
    FEndOfString := true ;
  end ;
  try
    Result := StrToInt( NumeroStr ) ;
  except
    on EConvertError do FErrorFlag := true ;
  end
end ;
procedure TForm1.Button1Click(Sender: TObject);
var MyExtractor : TIntegerExtractor ;
    I : Integer ;
begin
  MyExtractor := TIntegerExtractor.Create( ',','7,10,12,15' ) ;
  while ( not MyExtractor.EoS ) do
  begin
    I := MyExtractor.NextInteger ;
    if ( MyExtractor.Error ) then
    begin
      ShowMessage( 'Errore durante la conversione !' ) ;
      break ;
    end ;
    ShowMessage( IntToStr( I ) ) ;
  end ;
  MyExtractor.Free ;
end ;
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."