str2con und führende Nullen

Beim Ein- und Auspacken von Zeichenketten (Strings) mit führenden Nullen, die als Ganzzahlenwerte (Integer) interpretiert werden können, kann es dazu kommen, dass Werte verändert werden:

static void str2ConLeadingZeros(Args _args)
{
    container con = ['0123', 'OneMoreValue'];
    str s = con2Str(con);
    con = str2con(s);
    info(conPeek(con, 1));
}

Der Job zeigt das Problem auf: Aus 0123 wird durch den Aufruf von str2con der Wert 123, weil eine Typkonvertierung zu einer Ganzzahl stattfindet. Der Erfahrung nach gibt es solche Fälle häufig bei Kundennummern und Ähnlichem, die aus Vorsystemen übernommen wurden. Hier ist also Vorsicht geboten!

Lösen lässt sich das Ganze durch Verwendung der Funktion str2con_RU (bzw. Global::str2con_RU) statt str2con:

static void str2ConLeadingZeros(Args _args)
{
    container con = ['0123', 'OneMoreValue'];
    str s = con2Str(con);
    con = str2con_RU(s);
    info(conPeek(con, 1));
}

Hier bleibt der Wert 0123 erhalten.

Warum das eine Funktionalität des russischen Funktionspaket ist (zu erkennen am länderspezifischen Suffix RU), erschließt sich mir allerdings nicht 🙂

Update:
Ich wurde darauf hingewiesen, dass str2con einen Parameter besitzt, mit dem sich die Umwandlung zur Ganzzahl verhindern lässt, was ich zunächst tatsächlich übersehen hatte. Es handelt sich um den dritten Parameter (_convertNumericToInt64, welcher standardmäßig auf true gesetzt wird). Der zweite Parameter der Methode (_sep) ermöglicht es, das Trennzeichen (bzw. die Trennzeichenkette) zu definieren. Standard ist hierbei ein einfaches Komma. Natürlich verbirgt sich hier ebenfalls eine mögliche Fehlerquelle und Lösung dafür. Die einzelnen Elemente der Zeichenkette, die aufgeteilt werden sollen, dürfen selbst nicht das oder die Trennzeichen enthalten. Außerdem muss man sicherstellen, dass immer der gleiche Separator verwendet wird, wenn man zwischen String und Container hin- und herwechselt. In Summe würde eine bessere Lösung also so aussehen können:

static void str2ConLeadingZeros(Args _args)
{
    container con = ['0123', 'OneMoreValue', 'Deuss, Volker'];
    str s = con2Str(con, '|');
    con = str2con(s, '|', false);
    info(conPeek(con, 1));
}

Danke and Pontus für den Hinweis!

Schreibe einen Kommentar