之前收藏一位大虾的:
*****************************************************************
***
数的进位制的转换 GetNumSystem V1.00 1T2T
***
作用:将指定进位制的数转换为另一个指定进位制的数
***
语法:
***
?GetNuMSystem(2,10,"1010")
&&结果为"10"
***
?GetNumSystem(32,10,"1T2T")
&&结果为"62557"
***
事件:
***
2007.03.05
建立本函数
***
2007.03.06
修改
***
(1)将lcSource表示的字符改为大写并去掉前导和尾部空格
***
(2)增加若lnFrom和lnTo相等时的直接返回原来数据
***
(3)Local变量增加lnDec、lcResult
*****************************************************************
Parameters lnFrom,lnTo,lcSource
*
判断参数个数及其类型
If Type("lnFrom")#Chr(78) Or Type("lnTo")#Chr(78) Or Type("lcSource")#Chr(67)
Return "Error #0001 : 缺少参数或参数数据类型错误。"
EndIf
*
判断进制是否为2-36进制
If Int(lnFrom)#lnFrom Or !Between(lnFrom,2,36) Or Int(lnTo)#lnTo Or !Between(lnTo,2,36)
Return "Error #0002 : 转换的数的进制错误,只能在2-36进制之间转换。"
EndIf
*
判断需要转换的数是否符合lnFrom进制要求
Local lcString,lnCnt,llResult,lnDec,lcResult
lcString="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
&&数的符号体系
lcSource=Alltrim(Upper(lcSource))
&&输入的数修改为大写去掉前导和尾部空格
llResult=.T.
For lnCnt=1 To Len(lcSource)
If !Substr(lcSource,lnCnt,1)$Substr(lcString,1,lnFrom)
llResult=.F.
Exit
EndIf
EndFor
If llResult=.F. Or Empty(lcSource)
Return "Error #0003 : 被转换的数不符合进位制要求。"
EndIf
*
转换前进位制与转换后进位制相同的处理
If lnFrom=lnTo
&&不转换
Return lcSource
EndIf
*
lnFrom进制转换为十进制
lnDec=0
For lnCnt=1 To Len(lcSource)
lnDec=lnDec+lnFrom^(lnCnt-1)*(At(Substr(lcSource,Len(lcSource)-lnCnt+1,1),lcString)-1)
EndFor
*
十进制转换为lnTo进制
lcResult=''
Do While lnDec>0
lcResult=Substr(lcString,Mod(lnDec,lnTo)+1,1)+lcResult
lnDec=(lnDec-Mod(lnDec,lnTo))/lnTo
EndDo
Return Iif(Empty(lcResult),"0",lcResult)
* Eof : GetNumSystem V1.00 By 1T2T (C)Copyright 2007-2007