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.

德尔福 XE2

我在这里错过了什么吗?

4

4 回答 4

5

你是对的:Val()不兼容UInt64 / QWord

有两个重载函数:

  • 一个返回浮点值;
  • 一个返回一个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 和非 Unicode 版本的 Delphi。

出错时返回 0。

于 2012-08-04T20:10:38.800 回答
3

根据文件

S 是字符串类型的表达式;它必须是形成有符号实数的字符序列。

我同意文档有点含糊;确实,形式究竟是什么意思,有符号实数究竟是什么意思(尤其num是整数类型时)?

不过,我认为要突出显示的部分是已签名的。在这种情况下,您需要一个整数,因此S必须是形成有符号整数的字符序列。但是你的最大值是High(Int64) = 9223372036854775807

于 2012-08-04T12:59:04.853 回答
0

确实缺乏这方面的文档,但我使用StrToUInt64and UIntToStrfrom System.SysUtils,它们在字符串和无符号 64 位整数之间进行转换。

我不确定这些是什么时候添加到 Delphi 中的,但它们肯定是在最近的几个版本中。

于 2015-08-18T13:31:32.947 回答
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 回答