Reputation: 7719
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 ?
Upvotes: 4
Views: 2838
Reputation: 6452
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.
Upvotes: 0
Reputation: 1
function TryStrToInt64(const S: string; out Value: Int64): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;
Upvotes: 0
Reputation: 43023
You are right: Val()
is not compatible with UInt64 / QWord
.
There are two overloaded functions:
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.
Upvotes: 5
Reputation: 108928
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
Upvotes: 3