function HexToDec(Str: string): Integer;
var
i, M: Integer;
begin
Result:=0;
M:=1;
Str:=AnsiUpperCase(Str);
for i:=Length(Str) downto 1 do
begin
case Str[i] of
'1'..'9': Result:=Result+(Ord(Str[i])-Ord('0'))*M;
'A'..'F': Result:=Result+(Ord(Str[i])-Ord('A')+10)*M;
end;
M:=M shl 4;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text<>'' then
Label2.Caption:=IntToStr(HexToDec(Edit1.Text));
end;
如何在没有函数的情况下使用它,因为我想在其他行中再次调用结果,以及hexa到octal怎么样?我必须从hexa转换到dec然后转到octal吗?
答案 0 :(得分:5)
Delphi已经可以做到这一点,因此您不需要编写解析数字的函数。实际上很简单:
function HexToDec(const Str: string): Integer;
begin
if (Str <> '') and ((Str[1] = '-') or (Str[1] = '+')) then
Result := StrToInt(Str[1] + '$' + Copy(Str, 2, MaxInt))
else
Result := StrToInt('$' + Str);
end;
请注意,这也会处理负十六进制数字或+$1234
等数字。
如何在没有功能的情况下使用它,因为我想在其他行再次调用结果?
如果您想重新使用该值,请将HexToDec
的结果分配给变量,并在IntToStr
中使用该结果。
FWIW,在你的函数中,不需要调用AnsiUpperCase
,因为无论如何所有十六进制数字都在ASCII范围内。更简单的UpperCase
也应该有用。
答案 1 :(得分:2)
我的第一个评论是你没有使用你的函数将十六进制转换为十进制(虽然你将十进制转换为中间值),而是十六进制转换为整数。 IntToStr然后有效地将整数转换为基数10。为了概括你想要的东西,我将创建两个函数 - strBaseToInt和IntToStrBase,其中Base意味着暗示例如16表示十六进制,10表示十进制,8表示八进制等,并假设惯例采用六角形A = 10,依此类推,但(可能)Z = 35,使最大基数为36。
我不处理+或 - 但可以轻松添加。
在反向功能中,为了简化说明,我已经省略了支持负值。
感谢Rudy的改进
function StrBaseToInt(const Str: string; const Base : integer): Integer;
var
i, iVal, iTest: Longword;
begin
if (Base > 36) or (Base < 2) then raise Exception.Create('Invalid Base');
Result:=0;
iTest := 0;
for i:=1 to Length(Str) do
begin
case Str[i] of
'0'..'9': iVal := (Ord(Str[i])-Ord('0'));
'A'..'Z': iVal := (Ord(Str[i])-Ord('A')+10);
'a'..'z': iVal := (Ord(Str[i])-Ord('a')+10);
else raise Exception.Create( 'Illegal character found');
end;
if iVal < Base then
begin
Result:=Result * Base + iVal;
if Result < iTest then // overflow test!
begin
raise Exception.Create( 'Overflow occurred');
end
else
begin
iTest := Result;
end;
end
else
begin
raise Exception.Create( 'Illegal character found');
end;
end;
end;
然后,例如你的HexToOct函数看起来像这样
function HexToOct( Value : string ) : string;
begin
Result := IntToStrBase( StrBaseToInt( Value, 16), 8 );
end;
一般功能是
function BaseToBase( const Value : string; const FromBase, ToBase : integer ) : string;
begin
Result := IntToStrBase( StrBaseToInt( Value, FromBase ),ToBase );
end;