在按钮事件里写
//sValue 就是被转换的值 sFormat 就是被转换的值的取值范围如16进制就是0123456789ABCDEF iCarry 就是进制
iDecimal:=CarryToDecimal(sValue,sFormat,iCarry);
lbDecRet.caption:=IntToStr(iDecimal);
function CarryToDecimal(sSeqOfCarry,sFormat: string; iCarry: Integer): Integer;
var
i,j,iLenth,k1,k2,x: integer;
cc: char;
begin
sSeqOfCarry:=Trim(sSeqOfCarry); //需要被转成十进制的值X
k2 := iCarry; //X 的进制
if (sSeqOfCarry ='') then //居然是空的,十进制就是0
begin
Result:=0;
Exit;
end;
iLenth := length(sSeqOfCarry); //X的长度
j := iLenth;
x := 0;
repeat //思路:从X第低位到高位逐个取对应的值Y,找出Y的十进制是多少,确定Y要累乘进制多少次,然后累加
cc := sSeqOfCarry[j]; //变量j的作用就是从低位到高位取值用的。
k1 := pos(cc, sFormat)-1; //找出X当前位Y对应的十进制是多少 利用POS函数再减去1,sForamt 就是原始值的取值范围
for i := 1 to iLenth-j-1 do //确定Y要被累乘多少次
begin //iLength 就是X的长度 j就是当前位的索引 长度减去索引再减去1 就是累乘的次数
k2 := k2 * iCarry;
end;
if j = iLenth then //Y的索引和长度一样的时候取的肯定是最低位这个时候不需要累乘了,直接加就可以了
x := x + k1
else //累乘后把前面若干位求出的十进制累加
x := x + k1 * k2;
Dec(j);
until j=0;
Result := x;
end;