Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#18

Re: Unicode Ersatz für Format

  Alt 31. Okt 2007, 08:43
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;
$2B or not $2B
  Mit Zitat antworten Zitat