Hi,
ich hatte ein ähnliches Problem (bei mir ging es vor allem um Sortierung) vor nicht allzulanger Zeit und habe da einige kleine Funktionien gebastelt. Die decken leider nicht alle Sonderfälle ab, aber ich denke man kann diese notfalls sicher erweitern:
Delphi-Quellcode:
function ExtractNumberFromString( s: String ): String;
function ExtractIntegerFromString( s: String ): Integer;
Delphi-Quellcode:
function ExtractIntegerFromString( s: String ): Integer;
var
i: Integer;
tmpstr: String;
begin
tmpstr := '';
// String cleanup...
while ( pos( ' ', s ) > 0 ) do
s := StringReplace( s, ' ', ' ', [rfReplaceAll, rfIgnoreCase] );
// Extract the number (that maybe contains alphanumeric data)
s := ExtractNumberFromString( trim( s ) );
// Now try to get all NUMERIC data - in case the current char is not
// NUMERIC break the loop. That will prevent to add a "false" number
// like in street names "maggiestreet 22/2b" >> "22"
for i:=1 to length( s ) do
if ( s[i] in ['0'..'9'] ) then
tmpstr := tmpstr + s[i]
else
break;
result := StrToIntDef( tmpstr, -1 );
end;
function ExtractNumberFromString( s: String ): String;
var
i: Integer;
currentdepth: Byte;
lastknown: SmallInt;
const
maxdepth: Byte = 4;
begin
result := '';
currentdepth := 0;
lastknown := 0;
for i:=length( s ) downto 1 do
begin
if ( s[i] in ['0'..'9'] ) then
begin
lastknown := i;
currentdepth := 0;
end else
inc( currentdepth );
if ( currentdepth > maxdepth ) then
begin
if ( lastknown > 0 ) then
result := copy( s, lastknown, length( s ) );
break;
end;
end;
end;
Grundsätzlich arbeiten beide Funktionen recht ähnlich. Ein Beispiel:
Neumannstrasse 22 c
Ergebnis (ExtractNumberFromString):
22 c
Ergebnis (ExtractIntegerFromString):
22
Man kann die Tiefe der Suche entsprechend anpassen, d.h. wann gilt eine Hausnummer noch als Hausnummer und wann nicht mehr. Tiefe bedeutet also alle nicht numerischen Zahlen:
maxdepth: Byte = 4;
Es ging mir dabei wie gesagt primär um die korrekte (natürliche) Sortierung von Strassen inklusive Hausnummern. Bitte verzeih, dass dabei derzeit der Strassenname selbst nicht ausgegeben wird. Dies wäre aber ebenfalls leicht erweiterbar. Ich hoffe das hilft wenigstens ein bischen...