0

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

null
    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    @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

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Frank,

    "for char in textNumber do" -  fehlt da nicht split(textNumber,"")?

    Leo

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Wolfgang_Domrose
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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!

    • Team Lead Customer Service
    • joerg
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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

    • Wolfgang_Domrose
    • vor 5 Jahren
    • Gemeldet - anzeigen

    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
  • 2776Ansichten