TIA String-Inhalt immer in Großbuchstaben ausgeben

DEWA

Level-2
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich hab momentan das Problem, das ein Bedienr über ein Pop-Up Fenster 3 Zeichen eingibt die im weiteren Verlauf dann mal auf eine Oberfläche gelasert werden.

Da der Kunde seine Bediener als Affen einschätz, hat er uns jetzt die Anforderung gestellt, doch dafür zu Sorgen, dass die eingegebenen Buchstaben immer also Großbuchstaben an den Laser weitergegeben werden.

Also nochmal kurz zusammengefasst:

Ich erhalte eine String mit 3 Zeichen
Ich soll kontrollieren, ob der Inhalt Großbuchstaben sind
Ist dies nicht der Fall sollen aus den Klein- bitte Großbuchstaebn gemacht werden


Hab schon ein wenig geschaut und es gibt wohl den Weg, dass man sich die Ascii-Werte des jeweiligen Byte ausgibt und da dann auf den Acsii-Wert vergleicht ob der im richtigen Bereich ist.

Da jetzt die Fraeg der Umsetzung.
Wie lese ich den Ascii-Wert aus und wie kann ich den dann so manipulieren, dass ich dann den korrekten Wert wieder im String hinterlege.

Vielen Dank vorab schon einmal.
 
Im ASCII-Code beginnen die Großbuchstaben ab dez. 65, die Kleinbuchstaben ab dez. 97. Du liest dir also die Bytes ein, und wenn diese zwischen 97 und 122 liegen ziehst du da den Wert 32 ab, und hast den Großbuchstaben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nach welchem Zeichensatz sind die Zeichen codiert? ASCII, ANSI, Unicode...?
Kommen auch Umlaute, ß und andere Sonderbuchstaben áé... vor? Dann evtl. besser eine Umcodierungstabelle hinterlegen. Oder mal bei OSCAT nach TO_UPPER und UPPERCASE schauen. Falls öfter benötigt, dann am besten eine Function schreiben für einfaches Wandeln alá: c := toUpper(IN:=c);

Nur ASCII-Zeichen 'a' bis 'z' etwa so:
Code:
  ...
  c : BYTE;
END_VAR

c := MyString[1]; IF c >= 'a' AND c <= 'z' THEN MyString[1] := c AND B#16#DF; END_IF;
c := MyString[2]; IF c >= 'a' AND c <= 'z' THEN MyString[2] := c AND B#16#DF; END_IF;
c := MyString[3]; IF c >= 'a' AND c <= 'z' THEN MyString[3] := c AND B#16#DF; END_IF;

PS: bei nur 3 Zeichen würde ich aus Performancegründen keine Schleife drum herum basteln.
PPS: Falls Du eine Function schreibst, dann in der Function das IN nicht mehrmals verwenden sondern zuerst auf eine lokale Variable umkopieren (multitaskingfest!)

Harald
 
Zuletzt bearbeitet:
Würde das dann so funktionieren?

FOR i:= 1TO 3 DO
IF BYTE_TO_INT(String) >= 65 AND BYTE_TO_INT(String <= 90 THEN
#O_Daten:= string;
ELSIF BYTE_TO_INT(String) >= 97 AND BYTE_TO_INT(String <= 122 THEN
BYTE_TO_INT(String)-32;
IF i == 3 THEN
#O_Daten := String;
END_IF;
ELSE
#O_error := 1;
END_IF;
 
Zuletzt bearbeitet:
Würde das dann so funktionieren?
Da hast Du zuviel auf einmal gewollt und falsch zusammengemischt. Und in der Schleife teilweise an falscher Stelle angeordnet und außerdem ziemlich ineffizient formuliert.

Code:
                FOR i:= 1 TO 3 DO
                    IF BYTE_TO_INT(String[i]) >= 65 AND BYTE_TO_INT(String[i] <= 90 THEN
                        [COLOR="#FF0000"]#O_Daten:= string;           //??[/COLOR]
                    ELSIF BYTE_TO_INT(String[i]) >= 97 AND BYTE_TO_INT(String[i] <= 122 THEN
                        [COLOR="#FF0000"]BYTE_TO_INT(String[i])-32;   //Syntaxfehler: Zuweisung des Ausdrucks fehlt[/COLOR]
                        IF i [COLOR="#FF0000"]==[/COLOR] 3 THEN               [COLOR="#FF0000"]//die 3 Zeilen nicht hier in der Schleife[/COLOR]
                            #O_Daten := String;      [COLOR="#FF0000"]//sondern nur diese Zeile hinter das END_FOR[/COLOR]
                        END_IF;
                    ELSE
                        #O_error := 1;  [COLOR="#0000FF"]//nicht vergessen bei kein Fehler: #O_error := 0;[/COLOR]
                    END_IF;
                [COLOR="#FF0000"]END_FOR;  //hat noch gefehlt[/COLOR]

[COLOR="#FF0000"]//einige Klammern ')' fehlen, BYTE_TO_INT ist unnötig[/COLOR]

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald danke für deine Hilfe.

Ich hätte den Fall jetzt so gelöst. kannst du nochmal schauen


IF LEN(#I_Lagerklass) = 3 THEN

#_lager_dummy := #I_Lagerklass;

FOR #_i := 1 TO 3 DO
IF BYTE_TO_INT(#I_Lagerklass[#_i]) >= 65 AND BYTE_TO_INT(#I_Lagerklass[#_i]) <= 90 THEN
#O_Daten := #I_Lagerklass;
ELSIF BYTE_TO_INT(#I_Lagerklass[#_i]) >= 97 AND BYTE_TO_INT(#I_Lagerklass[#_i]) <= 122 THEN
#_lager_dummy[#_i] := INT_TO_BYTE(BYTE_TO_INT(#I_Lagerklass[#_i]) - 32);
#_ret_bool := TRUE;
ELSE
#O_error := 1;
END_IF;
END_FOR;

IF #_ret_bool THEN
#O_Daten := #_lager_dummy;
ELSE
#O_Daten := #I_Lagerklass;
END_IF;

#O_done := 1;
ELSE
#_error := 1;
END_IF;
 
Willst Du außerdem prüfen ob der String nur Buchstaben (A..Z und a..z) und keine anderen Zeichen enthält?

Tipp: Programmcode in [CODE]-Tags posten: der #-Button im Beitragseditor

Harald
 
Genua er darf nur Zeichen a-z bzw. A-Z enthalten.

Okay danke für den Tipp mach ich beim nächsten mal so
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hätte den Fall jetzt so gelöst. kannst du nochmal schauen
Überarbeitet, aber ungetestet:
Code:
    #_lager_dummy := #I_Lagerklass;

    IF LEN(#_lager_dummy) <> 3 THEN
        #_error := 1;
    ELSE
        #_error := 0;

        FOR #_i := 1 TO 3 DO
            #c := #_lager_dummy[#_i];
            IF #c >= 'a' AND #c <= 'z' THEN         [COLOR="#008000"]//Kleinbuchstabe a..z ?[/COLOR]
                #_lager_dummy[#_i] := #c AND 16#DF; [COLOR="#008000"]//in Großbuchstabe A..Z wandeln[/COLOR]

            ELSIF #c < 'A' OR #c > 'Z' THEN         [COLOR="#008000"]//kein Großbuchstabe A..Z ?[/COLOR]
                #_error := 1;          [COLOR="#008000"]//unzulässiges Zeichen![/COLOR]
                EXIT;                  [COLOR="#008000"]//weitere Untersuchung abbrechen[/COLOR]
            END_IF;
        END_FOR;
    END_IF;

    IF NOT #_error THEN
        #O_Daten := #_lager_dummy;
    ELSE
        #O_Daten := #I_Lagerklass;
    END_IF;

    #O_done := NOT #_error;
    #O_error := #_error;

Harald
 
Kommen auch Umlaute, ß und andere Sonderbuchstaben áé... vor?
'ß': Das "sz" gibt es nicht als GrossBuchstaben - da müsste man 'SS' draus machen, also 1 Zeichen mehr. Ggfs als "FehlEingabe" bemeckern.
'ä', 'ö' und 'ü': Diese liegen nicht im Bereich 'a' bis 'z', aber AND B#16#DF funktioniert damit auch (B#16#DF ist übrigens der Code für 'ß').

Habe hier einen Code (keine Ahnung, wie er heisst) bei dem diverse SonderKleinBuchstaben (inkl. ä,ö und ü) im Bereich 224..254 (Ausnahme 247) liegen, die sich nach derselben Methode in Grossbuchstaben wandeln lassen.
Hierfür die entsprechende Erweiterung:
Code:
c := MyString[1]; IF c >= 'a' AND c <= 'z' OR c >= 224 AND c <= 254 AND c<>247 THEN MyString[1] := c AND B#16#DF; END_IF;
c := MyString[2]; IF c >= 'a' AND c <= 'z' OR c >= 224 AND c <= 254 AND c<>247 THEN MyString[2] := c AND B#16#DF; END_IF;
c := MyString[3]; IF c >= 'a' AND c <= 'z' OR c >= 224 AND c <= 254 AND c<>247 THEN MyString[3] := c AND B#16#DF; END_IF;
Alternative für
"Genua er darf nur Zeichen a-z bzw. A-Z enthalten."
aber mit ohne Prüfung der Anzahl Zeichen:
Code:
Error := False;
c := MyString[1] AND B#16#DF; IF c >= 'A' AND c <= 'Z' THEN MyString[1] := c; ELSE Error := True; END_IF;
c := MyString[2] AND B#16#DF; IF c >= 'A' AND c <= 'Z' THEN MyString[2] := c; ELSE Error := True; END_IF;
c := MyString[3] AND B#16#DF; IF c >= 'A' AND c <= 'Z' THEN MyString[3] := c; ELSE Error := True; END_IF;
 
Zuletzt bearbeitet:
'ß': Das "sz" gibt es nicht als GrossBuchstaben - da müsste man 'SS' draus machen, also 1 Zeichen mehr. Ggfs als "FehlEingabe" bemeckern.
Auf jeden Fall bedarf es einer Vereinbarung/Festlegung, ob Fehler oder beibehalten oder durch etwas ersetzen. Möglicherweise auch vereinbaren daß 'ß' durch 'S' ersetzt wird?

Habe hier einen Code (keine Ahnung, wie er heisst) bei dem diverse SonderKleinBuchstaben (inkl. ä,ö und ü) im Bereich 224..254 (Ausnahme 247) liegen, die sich nach derselben Methode in Grossbuchstaben wandeln lassen.
Hierfür die entsprechende Erweiterung:
Code:
c := MyString[1]; IF c >= 'a' AND c <= 'z' OR c >= 224 AND c <= 254 AND c<>247 THEN MyString[1] := c AND B#16#DF; END_IF;
Die Function TO_UPPER von OSCAT läßt sich so steuern, daß sie das ebenfalls genauso macht, mit den da "EXTENDED_ASCII" genannten Codes 224 bis 254 außer 247, siehe den Link in #3

Harald
 
Zurück
Oben