Val does not work with UInt64?

拟墨画扇 提交于 2019-12-07 08:20:21

问题


just curious why the following code fails to convert uint64 value in string representation ?

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

Am I missing something here ?


回答1:


According to the documentation,

S is a string-type expression; it must be a sequence of characters that form a signed real number.

I agree the documentation is a bit vague; indeed, what exactly does form mean, and exactly what is meant by a signed real number (especially if num is an integer type)?

Still, I think the part to highlight is signed. In this case, you want an integer, and so S must be a sequence of characters that form a signed integer. But then your maximum is High(Int64) = 9223372036854775807




回答2:


You are right: Val() is not compatible with UInt64 / QWord.

There are two overloaded functions:

  • One returning a floating point value;
  • One returning an Int64 (i.e. signed value).

You can use this code instead:

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;

It will work in both Unicode and not Unicode versions of Delphi.

On error, it returns 0.




回答3:


function TryStrToInt64(const S: string; out Value: Int64): Boolean;
var
  E: Integer;
begin
  Val(S, Value, E);
  Result := E = 0;
end;



回答4:


The documentation on this really is lacking, but I use StrToUInt64 and UIntToStr from System.SysUtils, and they convert between strings and unsigned 64-bit integers.

I'm not sure when these were added to Delphi, but they are certainly in the last few releases.



来源:https://stackoverflow.com/questions/11808825/val-does-not-work-with-uint64

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!