nicht nur, aber keine reelen Typen
wenn man jetzt nicht auf die
API versichtet und alles selbermachen will,
dann muß man entweder mit dem Fehlen einiger Formate leben, oder man muß versuchen den gewünschten Typen in die Grundtypen zu zerlegen (Bsp. siehe 1) oder muß diesen Typen selber z.B in einen String umwandeln (Bsp. siehe 2).
OK und man kann natürlich auch eine der vielen "fertigen" Unicodesammlungen verwenden.
1:
Delphi-Quellcode:
Function Format(S: WideString; Const Args: Array of Const): WideString;
Var StrBuffer2: Array[0..1023] of WideChar;
A: Array[0..15] of Integer;
i, i2: Integer;
i8: Int64;
Begin
// aufpassen!!! es wird eine unicodefähige StringReplace-Variante benötigt.
S := StringReplace(S, '%q', '%d%09d', [rfReplaceAll]);
S := StringReplace(S, '%F', '%d%09d,%09d', [rfReplaceAll]);
i2 := 0;
For i := 0 to High(Args) do
Case Args[i].VType of
vtInt64: Begin
i8 := Args[i].VInt64^;
A[i2] := i8 div 1000000000;
If i8 < 0 Then i8 := -i8;
A[i2 + 1] := i8 mod 1000000000;
Inc(i2, 2);
End;
vtExtended: Begin
i8 := Trunc(Args[i].VExtended^);
A[i2] := i8 div 1000000000;
If i8 < 0 Then i8 := -i8;
A[i2 + 1] := i8 mod 1000000000;
A[i2 + 2] := Trunc(Args[i].VExtended^ * 1000000000);
Inc(i2, 3);
End;
Else Begin
A[i2] := Args[i].VInteger;
Inc(i2);
End;
End;
wvsprintfW(@StrBuffer2, PWideChar(S), @A);
Result := PWideChar(@StrBuffer2);
End;
2:
Delphi-Quellcode:
Function Format(S: WideString; Const Args: Array of Const): WideString;
Var StrBuffer2: Array[0..1023] of WideChar;
A: Array[0..15] of Integer;
T: Array[0..15] of String;
i: Integer;
Begin
// aufpassen!!! es wird eine unicodefähige StringReplace-Variante benötigt.
S := StringReplace(S, '%q', '%S', [rfReplaceAll]);
S := StringReplace(S, '%f', '%S', [rfReplaceAll]);
For i := High(Args) downto 0 do
Case Args[i].VType of
vtInt64: Begin
T[i] := IntToStr(Args[i].VInt64^);
A[i] := PChar(T[i]);
End;
vtExtended: Begin
T[i] := FloatToStr(Args[i].VInt64^);
A[i] := PChar(T[i]);
End;
Else A[i] := Args[i].VInteger;
End;
wvsprintfW(@StrBuffer2, PWideChar(S), @A);
Result := PWideChar(@StrBuffer2);
End;