Gegenteil von StrZero()

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 69
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

Gegenteil von StrZero()

Beitrag von klammerauf »

Hallo,

ich habe Seriennummern, z.B. "000001234" oder "000400" oder auch "000A/123" oder "TEST".

Jetzt würde ich gerne die führenden Nullen wegnehmen, wenn vorhanden.

Die beste Methode ist bisher diese hier:

Code: Alles auswählen

StrTran(LTrim(StrTran(cSeriennr,'0',' ')),' ','0')
Hat noch jemand eine bessere Idee?
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Tom »

Wenn Du den Wert beibehalten willst, ist Deine Idee schlecht, weil sie aus „000105“ „15“ machen würde.

Code: Alles auswählen

Trim(Str(Val(c))
Herzlich,
Tom
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 69
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

Re: Gegenteil von StrZero()

Beitrag von klammerauf »

Hi Tom,

sicher?

Bei mir kommt da '105' raus:
30-10-2023_16-13-00.png
30-10-2023_16-13-00.png (26.81 KiB) 1843 mal betrachtet
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 69
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

Re: Gegenteil von StrZero()

Beitrag von klammerauf »

Und Trim(Str(Val('000A/123'))) würde nur 0 zurückgeben:
30-10-2023_16-16-40.png
30-10-2023_16-16-40.png (21.23 KiB) 1843 mal betrachtet
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Tom »

Ich hatte übersehen, dass Du auch Buchstaben in den Seriennummern hast.

Nummer sicher: Einfach in einen anderen String übertragen ab der ersten Stelle, die keine Null ist.
Herzlich,
Tom
flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Di, 11. Mai 2010 16:27
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal

Re: Gegenteil von StrZero()

Beitrag von flanelli »

klammerauf hat geschrieben: Mo, 30. Okt 2023 15:34 Hallo,

ich habe Seriennummern, z.B. "000001234" oder "000400" oder auch "000A/123" oder "TEST".

Code: Alles auswählen

StrTran(LTrim(StrTran(cSeriennr,'0',' ')),' ','0')
Hat noch jemand eine bessere Idee?
Wie wäre es mit REMLEFT(cSeriennr,"0")

Remright() ist das Pendant .....
Ahoile aus dem Süden
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Gegenteil von StrZero()

Beitrag von AUGE_OHR »

hi,
flanelli hat geschrieben: Mo, 30. Okt 2023 17:08 Wie wäre es mit REMLEFT(cSeriennr,"0")
Remright() ist das Pendant .....
woher kommt REMLEFT() :?:
gruss by OHR
Jimmy
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 996
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Gegenteil von StrZero()

Beitrag von HaPe »

woher kommt REMLEFT() :?:
Xbase++ 2.0
--
Hans-Peter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von brandelh »

Eine neue Funktion ... total übersehen, gleich mal starten :-)

Im Prinzip eine einfache do while Schleife, die den ersten "0" killt, bis etwas anderes vorne steht.
Die Funktion oben funktioniert scheinbar auch, aber die eigene Funktion würde genau das tun was man erwartet, ich ziehe solch einfachen Funktionen vor.
Wenn es aber tatsächlich schon eine fertige gibt, ist die sicher schneller.

Wobei ich nicht wüsste in welcher Situation deine Funktion tatsächlich scheitern sollte.
Gruß
Hubert
flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Di, 11. Mai 2010 16:27
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal

Re: Gegenteil von StrZero()

Beitrag von flanelli »

HaPe hat geschrieben: Mo, 30. Okt 2023 21:57
woher kommt REMLEFT() :?:
Xbase++ 2.0
Stimmt "fast" :-)
remleft() und remright() sind Funktionen die es bereits unter Clipper in den "Nantucket-Tools" gab.

In Xbase++ sind diese Funktionen auch schon lange in XBTW32 enthalten ( siehe nachstehend )

* READT.ME of XbToolsIII Version 1.90
* for Windows NT/2000/XP and Windows 95/98/Me
* Release: 1.90.331
* Date: April 26th 2006
*/
____________________________
1. Installation Requirements
You need Xbase++ Version 1.90.331 or higher to use this
version of XbToolsIII.
Ahoile aus dem Süden
Benutzeravatar
klammerauf
UDF-Programmierer
UDF-Programmierer
Beiträge: 69
Registriert: Do, 08. Feb 2007 14:16
Wohnort: Karlsruhe
Hat sich bedankt: 3 Mal

Re: Gegenteil von StrZero()

Beitrag von klammerauf »

Danke flanelli,

sehr schöne Funktion, kannte ich noch nicht.
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Jan »

Man kann sich auch einfach eine DO WHILE Schleife bauen. So lange vorne eine 0 steht mach ein SubStr() ab Position 2 daraus. Dann muß man nicht extra de Tools nur wegen dieser einen Funktion einbinden.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Tom »

Code: Alles auswählen

FUNCTION RemoveLeft(cText,cChar)
LOCAL n := 1
DO WHILE SubStr(cText,n,1) == cChar
  n ++
ENDDO
RETURN SubStr(cText,n)
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Jan »

Oder so.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Di, 11. Mai 2010 16:27
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal

Re: Gegenteil von StrZero()

Beitrag von flanelli »

Jan hat geschrieben: Di, 31. Okt 2023 7:49 Man kann sich auch einfach eine DO WHILE Schleife bauen. So lange vorne eine 0 steht mach ein SubStr() ab Position 2 daraus. Dann muß man nicht extra de Tools nur wegen dieser einen Funktion einbinden.

Jan
Man kann im Prinzip alles und daher kann man auch weitere etliche Funktionen aus den Tools verwenden aber
natürlich muß man das auch wollen bzw. die Effizienz dieser Funktionen auch verstehen aber das möchte
ich an dieser Stelle lieber nicht vertiefen :roll:
Ahoile aus dem Süden
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2126
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: Gegenteil von StrZero()

Beitrag von Werner_Bayern »

Tom hat geschrieben: Di, 31. Okt 2023 7:59

Code: Alles auswählen

FUNCTION RemoveLeft(cText,cChar)
LOCAL n := 1
DO WHILE SubStr(cText,n,1) == cChar
  n ++
ENDDO
RETURN SubStr(cText,n)
DO WHILE cText[n] == cChar ?

Sollte deutlich schneller sein.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Tom »

Wollte ich auch noch machen, hatte dann aber überlegt, das noch für variable Patterns anzubieten, aber ich habe Grippe und kriege deshalb nicht alles so schnell auf die Reihe. 8)

Dann muss allerdings auch noch abgefangen werden, dass es überhaupt keinen Treffer geben kann, sonst schmierst Du mit einem Laufzeitfehler ab.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Tom »

Das wäre die optimierte Fassung, aber bei 100.000 Anwendungen gab es auf einem, äh, ziemlich zügigen Rechner keinen messbaren Unterschied zur Version mit SubStr().

Code: Alles auswählen

FUNCTION RemoveLeft(cText,cChar) // entfernt das Zeichen "cChar" von links beginnend aus "cText", bis das erste andere Zeichen kommt
LOCAL n := 1, nLen := Len(cText)
DO WHILE n <= nLen .AND. cText[n] == cChar
  n ++
ENDDO
RETURN SubStr(cText,n)
Edit: Bei einer Million Anwendungen braucht diese Fassung auf dem Testrechner 0,31 Sekunden, die andere 0,36 Sekunden insgesamt, das sind immerhin 14 Prozent mehr. Natürlich wird niemand eine solche Funktion so extrem häufig nacheinander aufrufen, aber man ruft tonnenweise Funktionalitäten auf, bei denen es das von Werner angemerkte Optimierungspotential gibt, und das summiert sich. Der Zugriff auf ein Zeichen aus einem String über die Arraynutzung ist schneller als die Anwendung einer Funktion (SubStr) dafür. Es gibt viele Ecken, in denen solches Potential wartet.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Tom »

Das hier hat übrigens ChatGPT aus der Anfrage gemacht.
chatgp_15.png
chatgp_15.png (101.38 KiB) 2018 mal betrachtet
Herzlich,
Tom
flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Di, 11. Mai 2010 16:27
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal

Re: Gegenteil von StrZero()

Beitrag von flanelli »

Tom hat geschrieben: Do, 02. Nov 2023 13:14 Das hier hat übrigens ChatGPT aus der Anfrage gemacht.
ChatGPT in "Ehren" und ich bin definitiv ein absoluter Fan von selbstkreierten Funktionen aber zu diesem
Thema/Themen wird meines Erachtens alles durch die Funktionen aus den Alaska XbToolsIII abgedeckt
und das Argument, man müsse wegen solchen "Kleinkram" ja nicht die Tools einbinden ist schon sehr dürftig.

So löst die XbToolIII-Funktion CharRem( <cDeleteChars>,<cString>)
dieses Thema noch erweitert um die Angabe von mehreren, zu löschenden Zeichen

z.B.:
Charrem("*AKO","ABCDE*FGHI*JKLMNOP") ergibt "BCDEFGHIJLMNP"

oder CharRem(chr(13)+chr(10), filestr("Mustertext.txt")) ........

PS.: Ok, die ChatGPT-Funktion kann zwar keine "Multicharakter" aber dafür den Stop-Break :-)
Zuletzt geändert von flanelli am Do, 02. Nov 2023 14:03, insgesamt 1-mal geändert.
Ahoile aus dem Süden
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Tom »

CharRem entfernt einen bestimmten Buchstaben oder Buchstaben einer Zeichenfolge aus einer anderen Zeichenfolge. Das ist nicht das, was hier gefordert war. Und das mit ChatGPT habe ich nur gezeigt, um zu zeigen, was ChatGPT dazu zu sagen hat. Die Lösung für das eigentliche Problem steht weiter oben in diesem Thread.
Die Tools sind doch in Xbase++ ab Version 2.0 sowieso enthalten. Da muss nicht viel extra eingebunden werden, nur eine Referenz auf die LIBs.
Herzlich,
Tom
flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Di, 11. Mai 2010 16:27
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal

Re: Gegenteil von StrZero()

Beitrag von flanelli »

Tom hat geschrieben: Do, 02. Nov 2023 13:59 CharRem entfernt einen bestimmten Buchstaben oder Buchstaben einer Zeichenfolge aus einer anderen Zeichenfolge. Das ist nicht das, was hier gefordert war. Und das mit ChatGPT habe ich nur gezeigt, um zu zeigen, was ChatGPT dazu zu sagen hat. Die Lösung für das eigentliche Problem steht weiter oben in diesem Thread.
Die Tools sind doch in Xbase++ ab Version 2.0 sowieso enthalten. Da muss nicht viel extra eingebunden werden, nur eine Referenz auf die LIBs.
Werter Tom,
ich will jetzt hier beileibe nicht "Erbsenzählen" und MIR ist vollkommen klar, Dass Du nur aufzeigen wolltest was ChatGTP
dazu zu sagen hat.

Meine Bemerkung zur "Einbindung der Tools wegen Kleinkram" bezieht sich auch die, meines Erachtens einfach unpassende
bzw. unbedachte Anmerkung von JAN - Zitat "Dann muß man nicht extra de Tools nur wegen dieser einen Funktion einbinden."
Natürlich auch klar, dass die Tools ab 2.0 enthalten sind aber es gibt mit Sicherheit jede Menge App's die noch ( und manche sicher auch weiterhin ) unter den Vorgängerversionen laufen. ( Wahrscheinlich auch bei JAN sonst hätte er ja nicht von
einer Einbindung gesprochen )

Die Lösung für das eigentliche Problem steht weiter oben in diesem Thread.
Stimmt exakt und zwar unter anderem mittels RemLeft() :-)

Und last but not least, das mit ChatGPT hatte ja auch nichts mit dem zutun was hier gefordert war und somit ist
auch meine Darlegung von CharRem() nur die Antwort auf die ChatGTP-Abhandlung :D

Im übrigen bin ich für jede Deiner Äußerungen, Darstellungen, Erklärungen, Hinweise, Ratschläge sowie auch Ironien und kleine Spitzen stets dankbar denn Sie haben allesamt zum Einen Hand und Fuß und zum Anderen dazu noch viel Geist.... =D>

Und jetzt schweig ich ( vorausichtlich ) wieder ein bißchen
Zuletzt geändert von flanelli am Do, 02. Nov 2023 14:28, insgesamt 1-mal geändert.
Ahoile aus dem Süden
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Jan »

Da sich das in den beiden letzten Beiträgen auf meinen Hinweis bezieht: Klar ist das in heutigen Zeiten vollkommen egal, wie groß meine Gesamtanwendung ist. Ob ich da eine Runtime mehr oder weniger einbinde ist vollkommen egal. Und ja, heute sind die Tools im Gesamtpakt mit drin, früher musste man die noch für einiges Geld extra kaufen (was ich tatsächlich auch gemacht hatte damals).

Vielleicht bin ich da etwas altmodisch. Aber ich mach mir da schon noch Gedanken drum. Nur wegen einer Funktion, die ich mir mit weniger als 10 Zeilen Code (für die ich nicht mal sehr viel Gehirnschmalz brauche) eben mal schnell selber schreiben kann, werde ich mir keine extra Bibliothek einbinden und an meine Kunden ausliefern. Nennt mich da seltsam oder eigenbrödlerisch, aber so ist das halt.

Flanelli, ich weiß das du aus irgend einem Grund mich auf dem Kieker hast. Aber meine Anmerkung weiter oben war eben nicht "unbedacht". Sondern absolut bewußt geschrieben.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Gegenteil von StrZero()

Beitrag von Tom »

Und last but not least, das mit ChatGPT hatte ja auch nichts mit dem zutun was hier gefordert war
Doch, schon, nur war die Anfrage zu ungenau formuliert. Mit nur sehr kleinen Änderungen macht die ChatGPT-Funktion genau das, was hier gefordert war.
Herzlich,
Tom
flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Di, 11. Mai 2010 16:27
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal

Re: Gegenteil von StrZero()

Beitrag von flanelli »

Tom hat geschrieben: Do, 02. Nov 2023 14:31
Und last but not least, das mit ChatGPT hatte ja auch nichts mit dem zutun was hier gefordert war
Doch, schon, nur war die Anfrage zu ungenau formuliert. Mit nur sehr kleinen Änderungen macht die ChatGPT-Funktion genau das, was hier gefordert war.
Smile, doch noch kein Schweigen :-)
So wie die ChatGPT-Funktion dasteht macht sie genau NICHT das, was hier gefordert wurde und bedarf in JEDEM Falle "kleine" Änderungen denn insbesondere die STOP-Marke macht hinsichtlich der Anforderungen von <klammerauf> sein kleines Problem erst recht zum einem richtigen Problem.
klammerauf hat geschrieben: Mo, 30. Okt 2023 15:34 ich habe Seriennummern, z.B. "000001234" oder "000400" oder auch "000A/123" oder "TEST".
Jetzt würde ich gerne die führenden Nullen wegnehmen, wenn vorhanden.
Mit der ChatGTP-Funktion müßte er somit für jeden String genau das STOP-Zeichen kennen und anführen z.b. hier die "4"
denn anderenfalls werden definitiv ALLE Nullen entfernt und nicht nur die vorangeführten.

Und da diese ChatGTP-Funktion im Original dastand und somit eben NICHT das Problem von <klammerauf> löst habe
ich mit dem CharRem() nur auf die m.E. optimalere Variante zu dieser ChatGTP-Funktion hingewiesen.
Man kann halt nicht nur ein bisserl schwanger sein... Wenn schon dann ganz oder gar nicht :-)

So, jetzt schweige ich aber wirklich denn anderenfalls wird das Thema zum Bandlwurm :-)
Ahoile aus dem Süden
Antworten