4

次のコードが文字列表現でuint64値を変換できない理由に興味がありますか?

var
  num: UInt64;
  s: string;
  err: Integer;

begin
  s := '18446744073709551615';  // High(UInt64)
  Val(s, num, err);
  if err <> 0 then
    raise Exception.Create('Failed to convert UInt64 at ' + IntToStr(err));  // returns 20
end.

Delphi XE2

私はここで何かが欠けていますか?

4

4 に答える 4

5

あなたは正しいです:Val()と互換性がありませんUInt64 / QWord

2つのオーバーロードされた関数があります:

  • 1つは浮動小数点値を返します。
  • Int64(つまり、符号付きの値)を返すもの。

代わりに次のコードを使用できます。

function StrToUInt64(const S: String): UInt64;
var c: cardinal;
    P: PChar;
begin
  P := Pointer(S);
  if P=nil then begin
    result := 0;
    exit;
  end;
  if ord(P^) in [1..32] then repeat inc(P) until not(ord(P^) in [1..32]);
  c := ord(P^)-48;
  if c>9 then
    result := 0 else begin
    result := c;
    inc(P);
    repeat
      c := ord(P^)-48;
      if c>9 then
        break else
        result := result*10+c;
      inc(P);
    until false;
  end;
end;

UnicodeバージョンとDelphiのUnicodeバージョンの両方で機能します。

エラーの場合、0を返します。

于 2012-08-04T20:10:38.800 に答える
3

ドキュメントによると、

Sは文字列型の式です。符号付き実数を形成する一連の文字である必要があります。

ドキュメントが少し曖昧であることに同意します。実際、formは正確には何を意味し、符号付き実数が正確に何を意味するのでしょうか(特にnum整数型の場合)。

それでも、強調する部分は署名されていると思います。この場合、整数が必要なので、符号付き整数を形成する文字のシーケンスであるS必要があります。しかし、あなたの最大値はHigh(Int64) = 9223372036854775807

于 2012-08-04T12:59:04.853 に答える
0
function TryStrToInt64(const S: string; out Value: Int64): Boolean;
var
  E: Integer;
begin
  Val(S, Value, E);
  Result := E = 0;
end;
于 2015-08-18T10:32:36.507 に答える
0

これに関するドキュメントは実際には不足していますが、私はStrToUInt64and UIntToStrfromを使用しておりSystem.SysUtils、文字列と符号なし64ビット整数の間で変換します。

これらがいつDelphiに追加されたかはわかりませんが、確かに最後の数リリースに含まれています。

于 2015-08-18T13:31:32.947 に答える