foxpro 的进制转换函数

之前收藏一位大虾的:

*****************************************************************
***  数的进位制的转换 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

 » 转载请注明来源:网络蛀虫小窝 » 《foxpro 的进制转换函数》
 » 本站地址:http://www.gomoth.com

标签: