String zeichenweise verarbeiten
Hallo,
ich möchte einen Textstring zeichenweise verarbeiten. Z. B. um aus einem String mit Ziffern die Quersumme zu berechnen.
Ich mache das so:
let prstr := "";
for i from 0 to length(bnr) do
let ziffer := number(substr(bnr, i, 1));
prstr := prstr + format(ziffer, "0");
end;
So funktioniert es - obwohl doch eigentlich in der for-Schleife "to length(bnr) - 1" stehen müsste. Schließlich fängt der Index bei 0 an - aber die Länge wird ja wohl korrekt sein.
Wo ist der Trugschluss?
Viele Grüße
Wolfgang
9 Antworten
-
bei from ... to Konstellation ist from immer inklusuve und to exklucive
---
Please note, that for range(From, To), From in inclusive and To is exclusive. To state an example:
concat(range(0, 4))=> 0, 1, 2, 3
concat(for i in range(0, 4) do i*i end) => 0, 1, 4, 9----
Leo
-
Hallo Wolfgang,
die Sache mit der Länge und dem Index lässt mich auch gerade unwissen - aber mein Kopf funktioniert auch gerade nicht mehr so gut... ;)
Aber ein anderer Ansatz: Mit split(text, "") kannst du einen Text zeichenweise in ein Array überführen und dieses dann in einer Schleife durchgehen - sieht dann so aus:
var prstr := "";
for char in split(bnr, "") do
let ziffer := nuber(char);
prstr := prstr + ", " + format(ziffer, "0");
end;
Ich finde diesen Ansatz sehr komforabel und wollte ihn dir daher als Alternative vorstellen.
VG Frank
-
@Frank
Sehr elegant. Ich verstehe zwar nicht wie man damit die Quersumme errechnen kann aber die Sache mit split(text,"") ist wirklich sehr nützlich.
Leo
-
Hallo Leo,
na für die Quersummenberechnung fehlt natürlich mittendrin was - aber war ja hier nicht so richtig die Frage. Die Berechnung einer Prüfziffer nach Modulo 10 (z. B. EAN-Prüfziffer) würde dann z. B. so aussehen:
function calcEANCheckDigit(textNumber : text) do
var multiple := false;
var mySum := 0;
for char in textNumber do
if multiple then
mySum := mySum + number(char) * 3
else
mySum := mySum + number(char)
end;
multiple := not multiple
end;
ceil(mySum / 10) * 10 - mySum
end;
Und vielen Dank für deine Aufklärung zur Range-Frage - das war mir so gar nicht bewusst. :)
VG Frank
-
Hallo Frank,
"for char in textNumber do" - fehlt da nicht split(textNumber,"")?
Leo
-
Hallo Leo,
ja eigentlich schon ... funktioniert aber trotzdem. Bedeutet wohl, dass ein for ... in ... für einen Text automatisch eine Schleife durch die Zeichen vom ersten bis zum letzten Buchstaben macht.
So also noch einfacher - manches findet man nur durch die eigenen Fehler raus.
LG Frank
-
Na, da habe ich ja was losgetreten...
Also, ich habe einiges gelernt. In meinem Fall ist die Schleife "for char in string" die einfachste Lösung. Gefunden habe ich das aber in der Doku noch nicht - oder hab ich was übersehen? Irgendwo fehlt mir eine Erklärung, an welche Programmiersprache NX sich anlehnt. Dann könnte man ja selber ein bisschen probieren, solange es keine umfassende Doku gibt.
Aber das Forum ist ja Spitze - und schnell!
Danke!
-
Hallo Wolfgang,
Danke für dein Feedback. Wir versuchen die Funktions- und Sprachreferenz in unserem Benutzerhandbuch immer so aktuell wie möglich zu halten. Daher sind wir für Hinweise was ggf. noch fehlt dankbar.
Die Schleifen sind im Abschnitt "Loops" schon drin. Das Kapitel findest du im Benutzerhandbuch hier:
https://ninoxdb.de/de/manual/erweiterte-Berechnungen/funktions-und-sprachreferenz
Gruß, Jörg
-
Hallo Jörg,
vielen Dank. Ich habe halt nicht realisiert, dass man ds auch eif einen String anwenden kann. Ein kleiner Satz zu diesem wichtigen Beispiel....
Content aside
- vor 5 JahrenZuletzt aktiv
- 9Antworten
- 2788Ansichten