Step 7 Integer in formatierten String umwandeln

Hagen

Level-1
Beiträge
149
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe die Aufgabe Intergerwerte zwischen 0 und 9999 in eine Zeichenkette umzuwandeln. Dabei müssen Werte die weniger als 4 Stellen haben mit Nullen aufgefüllt warden.

Ich habe dafür zwar einen Weg gefunden, bin aber nicht ganz glücklich damit und hoffe, dass ihr eine "elegantere" Lösung kennt.

Unten findet ihr meine Lösung in SCL geschrieben. Falls es keine andere Lösung gibt, kann diese natürlich von anderen gerne weiterverwendet warden.


Gruß Hagen


Code:
FUNCTION "FC_INT_STR" : STRING[4]

VAR_INPUT
    INT_VALUE : INT ;
END_VAR
VAR_TEMP
    // temporäre Variablen
    TEMP : INT ;
    TEMP2 : INT ;
    STR_VALUE : STRING[4] ;
    STRUCT_STR_VALUE AT STR_VALUE : STRUCT
        MAX_LEN :  BYTE ;
        TOTAL_LEN : BYTE ;
        CHARS : ARRAY[1..4] OF CHAR;
    END_STRUCT ;
END_VAR
    // Anweisungsteil
    TEMP := INT_VALUE MOD 10 ;   
    STRUCT_STR_VALUE.CHARS[4] := STRING_TO_CHAR(MID (IN:= INT_TO_STRING(TEMP), L:= 1, P:= 2)) ; // (IN:= STR_DATARCV, L:= LENGTH_STR, P:= START_STR);
    TEMP2 := INT_VALUE - TEMP ;
    
    TEMP := (TEMP2 / 10 ) MOD 10 ;
    STRUCT_STR_VALUE.CHARS[3] := STRING_TO_CHAR(MID (IN:= INT_TO_STRING(TEMP), L:= 1, P:= 2)) ;
    TEMP2 := TEMP2 / 10 - TEMP ;
    TEMP := (TEMP2 / 10 ) MOD 10 ;
    STRUCT_STR_VALUE.CHARS[2] := STRING_TO_CHAR(MID (IN:= INT_TO_STRING(TEMP), L:= 1, P:= 2)) ;
    TEMP2 := TEMP2 / 10 - TEMP ;
    
    TEMP := (TEMP2 / 10 ) MOD 10 ;
    STRUCT_STR_VALUE.CHARS[1] := STRING_TO_CHAR(MID (IN:= INT_TO_STRING(TEMP), L:= 1, P:= 2)) ;
    TEMP2 := TEMP2 / 10 - TEMP ;
    
    STRUCT_STR_VALUE.MAX_LEN := 4 ;
    STRUCT_STR_VALUE.TOTAL_LEN := 4 ;
    ;
"FC_INT_STR" := STR_VALUE ;    
END_FUNCTION
 
Da fallen mir spontan folgende Möglichkeiten ein:
A) Wert in BCD wandeln und als 4-stellig Hex-String ausgeben, z.B. mit FC95 HTA
B) Wert in String wandeln, Vorzeichen-Byte entfernen, an einen String "0000" hintenanhängen und davon die letzten 4 Zeichen nehmen
C) (String mit "0000" vorbelegen und) durch forlaufende Ziffernabspaltung (MOD 10) von hinten die Ziffern in CHAR wandeln und in den String speichern

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine Ziffernzerlegung ohne String-Umweg:
Code:
FUNCTION "FC_INT_STR4" : STRING[4]

VAR_INPUT
    INT_VALUE : INT ;
END_VAR
VAR_TEMP
    VALUE : INT ;
    TEMP : INT ;
    STR_VALUE : STRING[4] ;
    STRUCT_STR_VALUE AT STR_VALUE : STRUCT
        MAX_LEN :  BYTE ;
        TOTAL_LEN : BYTE ;
        CHARS : ARRAY[1..4] OF CHAR;
    END_STRUCT ;
END_VAR

    // Anweisungsteil
    VALUE := INT_VALUE;

    STRUCT_STR_VALUE.CHARS[4] := INT_TO_CHAR((VALUE MOD 10) + 16#30);
    STRUCT_STR_VALUE.CHARS[3] := INT_TO_CHAR(((VALUE / 10 ) MOD 10) + 16#30);
    STRUCT_STR_VALUE.CHARS[2] := INT_TO_CHAR(((VALUE / 100 ) MOD 10) + 16#30);
    STRUCT_STR_VALUE.CHARS[1] := INT_TO_CHAR(((VALUE / 1000 ) MOD 10) + 16#30);

    STRUCT_STR_VALUE.MAX_LEN := 4 ;
    STRUCT_STR_VALUE.TOTAL_LEN := 4 ;

    "FC_INT_STR4" := STR_VALUE ;    
END_FUNCTION

Harald
 
Hallo Harald,

danke für die Hilfe. Ich hatte deine Lösung auch versucht, allerdings ohne den Offset von Hex 30. Das lieferte natürlich nicht das erwünschte Ergebnis. So sollte es natürlich besser aussehen.

Gruß Hagen
 
Zurück
Oben