[gelöst] Suche AnsiIndexStr oder IndexStr

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

[gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von catweasel »

Moin

Ich suche eine Möglichkeit in einem String Zahlen zu finden. Bei Delphi bin ich dabei auf AnsiIndexStr bzw. IndexStr gestoßen.

Bsp.:

Code: Alles auswählen

source := 'das folgende sind 01234 Zahlen';
position := AnsiIndexStr(source, ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',]);
Leider scheint es etwas vergleichbares bei Lazarus nicht zu geben, oder?
Wir kann ich sonst Zahlen in einem String finden?

Gruß
Michael
Zuletzt geändert von catweasel am Di 13. Jul 2010, 14:12, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10861
Registriert: Mo 11. Sep 2006, 19:01

Re: Suche AnsiIndexStr oder IndexStr

Beitrag von theo »

Die Funktion gibt's schon in strutils, aber die tut nicht was du willst.

Es ist aber doch wirklich nicht so schwer.
Einfach die Buchstaben des String durchrattern und schauen ob sie in ['0'..'9'] liegen.

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: Suche AnsiIndexStr oder IndexStr

Beitrag von catweasel »

theo hat geschrieben:Die Funktion gibt's schon in strutils, aber die tut nicht was du willst.

Es ist aber doch wirklich nicht so schwer.
Einfach die Buchstaben des String durchrattern und schauen ob sie in ['0'..'9'] liegen.
Das hatte ich befürchtet :wink:
Ich hatte nur gehofft es gibt eine elegantere Methode

Gruß
Michael

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: Suche AnsiIndexStr oder IndexStr

Beitrag von catweasel »

theo hat geschrieben:Einfach die Buchstaben des String durchrattern und schauen ob sie in ['0'..'9'] liegen.
Für den Fall das jemand vor dem gleichen Problem steht, hier meine Lösung dazu:

Code: Alles auswählen

text:='ein String mit 1234 als Zahl im Text';
for i:=1 to length(text) do begin
  if text[i] in ['0'..'9'] then zahlstring:=zahlstring+text[i];
end;
showmessage(zahlstring);
Gruß
Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von mschnell »

Nicht nur "nicht elegant", sondern vermutlich auch falsch.

Wie "rattert" man in einem UTF8-String die Buchstaben durch ?

Kann in UTF8 $30 ... $39 nie als zweites Byte eines Codes auftreten ?

-Michael

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von pluto »

Die Variable Text sollte von Typ UTF8String oder WideString sein. dann sollte es gehen.

ps:
Wenn die Funktion das tut was sie tun soll, kannst du sie ja in die "CodeLib" packen. Dann haben alle was davon.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von Socke »

mschnell hat geschrieben:Nicht nur "nicht elegant", sondern vermutlich auch falsch.

Wie "rattert" man in einem UTF8-String die Buchstaben durch ?

Kann in UTF8 $30 ... $39 nie als zweites Byte eines Codes auftreten ?

-Michael
1. Elegant eher weniger, aber richtig. Text ist nämlich ein Keyword von Pascal für Textdateien. Außerdem ist das hinzufügen von immer einem Buchstaben sehr ineffizient. Besser wäre Anfang und Ende suchen und dann mit Copy() kopieren.
2. Irgendwo in der RTL/FCL/LCL gibt es soweit ich weiß auch Funktionen dazu. Irgendwo in der Nähe des Typs TUTF8Char (oder so ähnlich).
3. Geraten: Nein. Die ersten 7 Bit sind in UTF8 genau wie ASCII kodiert. Da liegen alle lateinischen Buchstaben und arabischen Zahlen drinnen. Ansonsten sagen die Bits ganz Links aus, welcher Teil eines Zeichens sie sind (d.h. 0 = nur ein Byte; 1 = erstes Zeichen, erstes Byte...).
pluto hat geschrieben:Die Variable Text sollte von Typ UTF8String oder WideString sein. dann sollte es gehen.
UTF8String ist auch nichts anderes als ein AnsiString und enthält auch immer die Quelltextkodierung. WideString ist UCS2 und damit eine ganz andere Kodierung.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10861
Registriert: Mo 11. Sep 2006, 19:01

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von theo »

mschnell hat geschrieben: Kann in UTF8 $30 ... $39 nie als zweites Byte eines Codes auftreten ?
Alle für den ASCII Bereich (wie auch die Zahlen hier) geschriebene Prozeduren kann man unter UTF-8 völlig unverändert weiterverwenden. Code / HTML Parser laufen unverändert weiter.

Der Code von catweasel ist richtig und übersichtlich. Performanter wäre die Methode mit Copy, ist aber für den vorliegenden Fall wahrsch. komplett egal.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von pluto »

Der Code von catweasel ist richtig und übersichtlich. Performanter wäre die Methode mit Copy, ist aber für den vorliegenden Fall wahrsch. komplett egal.
Aber wohl auch nur für längere Zahlen Ketten. Nicht wenn es nur um vier oder acht stellige Zahlen geht.
UTF8String ist auch nichts anderes als ein AnsiString und enthält auch immer die Quelltextkodierung. WideString ist UCS2 und damit eine ganz andere Kodierung.
Ist mir bekannt. Aber dennoch laufen dann auch Forschleifen richtig. Wenn ich WideStrings oder UTF8Strings verwende. Das habe ich jedenfalls beobachtet. Aber vielleicht war es ja "auch" nur Zufall.
MFG
Michael Springwald

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von mschnell »

theo hat geschrieben:
mschnell hat geschrieben:Kann in UTF8 $30 ... $39 nie als zweites Byte eines Codes auftreten ?
....
(Nach Googeln der UTF-8 - Tabelle..)

Wenn Du einfach "Nein" gesagt hättest wäre alles klar gewesen. Damit hast Du nämlich recht. bei den Folge-Bytes von UTF-8 codes ist nämlich immer bit 7 gesetzt, so dass keine ASCII-Codierungen vorkommen können.

Gruß und Dank,
-Michael
Zuletzt geändert von mschnell am Mi 14. Jul 2010, 12:22, insgesamt 3-mal geändert.

Benutzeravatar
theo
Beiträge: 10861
Registriert: Mo 11. Sep 2006, 19:01

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von theo »

mschnell hat geschrieben: Wenn Du einfach "Nein" gesagt hättest wäre alles klar gewesen.
Sorry, dachte das wäre dann implizit klar. (Was es scheint's ja auch ist ;-)

Das ist ein Vorteil von UTF-8. Da die meisten Tokenizer/Parser nur im ASCII Range arbeiten, kann man den ANSI/ASCII Code sorglos übernehmen.
Egal ob da intern mit PChar oder was-weiss-ich gearbeitet wurde. Dass geht bei Doublebyte (WideChar) nat. nicht ohne weiteres.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von mschnell »

Schön !
Endlich erkenne ich 'mal einen Kompatibiltäts-Vorteil von UTF-8 gegenüber UTF-16. Sonst sah es für mich immer umgekehrt aus.

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von Socke »

mschnell hat geschrieben:Schön !
Endlich erkenne ich 'mal einen Kompatibiltäts-Vorteil von UTF-8 gegenüber UTF-16. Sonst sah es für mich immer umgekehrt aus.

-Michael
Solange du mit ASCII und nicht mit ISO-8859-X arbeitest ists richtig ;-)
pluto hat geschrieben:
UTF8String ist auch nichts anderes als ein AnsiString und enthält auch immer die Quelltextkodierung. WideString ist UCS2 und damit eine ganz andere Kodierung.
Ist mir bekannt. Aber dennoch laufen dann auch Forschleifen richtig. Wenn ich WideStrings oder UTF8Strings verwende. Das habe ich jedenfalls beobachtet. Aber vielleicht war es ja "auch" nur Zufall.
Solange du diene Quelltexte mit Widestrings nicht in UTF-X speicherst ist ja alles in Ordnung. Ansonsten möchte ich nicht wissen, was da dein Programm zur Laufzeit meint zu haben und was der Compiler überhaupt ausgespuckt hat :D.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

gsa
Beiträge: 9
Registriert: Fr 13. Jun 2008, 15:23
OS, Lazarus, FPC: Windows / Linux (FPC 3.2. fixes, Lazarus 3.0 fixes / trunk)

Re: Suche AnsiIndexStr oder IndexStr

Beitrag von gsa »

catweasel hat geschrieben:
theo hat geschrieben:Einfach die Buchstaben des String durchrattern und schauen ob sie in ['0'..'9'] liegen.
Für den Fall das jemand vor dem gleichen Problem steht, hier meine Lösung dazu:

Code: Alles auswählen

text:='ein String mit 1234 als Zahl im Text';
for i:=1 to length(text) do begin
  if text[i] in ['0'..'9'] then zahlstring:=zahlstring+text[i];
end;
showmessage(zahlstring);
Gruß
Michael
Ich kenne die Delphi-Funktion AnsiIndexStr bzw. IndexStr nicht und damit auch nicht das erwartete Ergebnis.

Wenn du deine Lösung beispielsweise mit

Code: Alles auswählen

text := '1 String mit 1234 als Zahl im Text mit 3 Ziffernblöcken';

Code: Alles auswählen

text := 'ein String mit 123,4 als Zahl im Text';

Code: Alles auswählen

text := 'ein String mit 12,34 als Zahl im Text';
fütterst, enspricht das jeweilige Ergebnis deinen Erwartungen?

Gruß Gerd

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: [gelöst] Suche AnsiIndexStr oder IndexStr

Beitrag von mse »

mschnell hat geschrieben:Endlich erkenne ich 'mal einen Kompatibiltäts-Vorteil von UTF-8 gegenüber UTF-16.
Wobei das gleiche Prinzip in einem erweiterten Sinne auch für UTF-16 gilt. Die Werte des 16 Bit Bereiches der BMP kommen mit Ausnahme des nicht zugewiesenen Bereiches $D800 $DFFF als Werte von surrogate-pairs nicht vor.
http://en.wikipedia.org/wiki/UTF-16/UCS-2

Antworten