注册 登录
编程论坛 VFP论坛

VFP有没有10进制转16进制的函数?

sam_jiang 发布于 2023-01-24 02:24, 1001 次点击
如题,虽然我自己写了这个函数,但我想问问系统里有没有?
14 回复
#2
nbwww2023-01-24 07:55
?TRANSFORM(123,'@0')
#3
吹水佬2023-01-24 07:56
转换是相对视觉效果来说
TRANSFORM()
STRCONV()
#4
sam_jiang2023-01-24 09:27
我希望的函数就是这种:
?f(255)
&&结果FF,或者0xFF
#5
igaoyuan2023-01-24 10:44
函数名:NumConver(nNum,nConver)
缩写:nmcv
进制转换函数,能够将一个数字转换为2至36进制的字符串
返回值:
字符型,转换后的字符串
参数:
nNum:整型,准备转换的数字
nConver:整型,进制,可设为2至36
示例代码
*下面代码演示了进制的转换:
程序代码:
Set Library To myFll

?"二进制:"+NumConver(1234567,2)
?"八进制:"+NumConver(1234567,8)
?"十六进制:"+NumConver(1234567,16)
?"三十进制:"+NumConver(1234567,30)

Set Library To




函数名:ConverNum(cNum,nConver)
缩写:cvnm
将指定进制的字符串转换为数值型。遇到此进制不能识别的字符就终止
返回值:
整型
参数:
cNum:字符型,准备转换的数字
nConver:整型,转换时依据的进制
示例代码
*下面代码演示了进制的转换
程序代码:
Set Library To myFll

?ConverNum("123AE",10)&&AE不属于10进制的字符,返回123
?ConverNum("123AE",16)&&AE是16进制的字符,返回74670,即0x123ae

Set Library To





[此贴子已经被作者于2023-1-24 10:46编辑过]

#6
吹水佬2023-01-24 11:12
输出字符串,用TRANSFORM截取需要长就可以。
#7
sdta2023-01-24 12:08
回复 5楼 igaoyuan
能自己写函数尽量自己写,否则用别人封装的函数那天出错了还不知道什么原因
#8
sam_jiang2023-01-24 20:00
回复 7楼 sdta
同感,这是我不太喜欢用fll的原因,我更喜欢vfp写的类。
#9
sam_jiang2023-01-24 20:08
回复 5楼 igaoyuan
谢谢
#10
sam_jiang2023-01-24 20:10
回复 2楼 nbwww
这是我想要的!谢谢
#11
sam_jiang2023-01-24 20:23
因为没有掌握transform函数用法,走了很多弯路,哈哈哈。。。
PARAMETERS nnum
creturn="0x"
cstr=""
DO WHILE .t.
    nhex=MOD(nnum,16)
    n=INT(nnum/16)
    IF nhex>9
        cstr=CHR(nhex+55)+cstr
    else   
        cstr=TRANSFORM(nhex)+cstr
    endif   
    IF n>=16
        nnum=n
        LOOP
    ELSE
        EXIT
    ENDIF
ENDDO
IF n#0
    IF n>9
        creturn=creturn+chr(n+55)+cstr
    ELSE
        creturn=creturn+TRANSFORM(n)+cstr   
    ENDIF   
else   
    creturn=creturn+cstr
ENDIF
   
RETURN creturn

谢谢各位
#12
吹水佬2023-01-24 22:03
回复 11楼 sam_jiang
思路没错,可以用数据结构优化一下算法,如:
num = 1234567890
ALINES(aHex,"0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F",",")
DO WHILE num > 0
    ? aHex[num%16+1]
    num = INT(num/16)
ENDDO
#13
sam_jiang2023-01-24 22:47
回复 12楼 吹水佬
简洁明了!
#14
sam_jiang2023-01-24 23:11
以下是引用sam_jiang在2023-1-24 22:47:15的发言:

简洁明了!

漏了一个num=0的情况。

PARAMETERS num
*num = 1234567890
creturn=""
ALINES(aHex,"0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F",",")
IF num=0 &&单独提出来运行是不是会快点?
    RETURN "0x0"
ENDIF
DO WHILE num >0
    creturn=aHex(num%16+1)+creturn
    *? aHex[num%16+1]
*!*    IF num=0 &&运行可能会慢点
*!*        EXIT
*!*    else   
        num = INT(num/16)
*!*    ENDIF   
ENDDO
RETURN "0x"+creturn

[此贴子已经被作者于2023-1-24 23:18编辑过]

#15
吹水佬2023-01-25 07:42
以下是引用sam_jiang在2023-1-24 23:11:59的发言:


漏了一个num=0的情况。

IF num=0 &&单独提出来运行是不是会快点?
    RETURN "0x0"
ENDIF

只要不是在循环体内,速度影响不大。
如果只考虑无符号整数,初始化creturn处理一下就可以:
creturn = IIF(num != 0, "", "0")
DO WHILE num > 0
  ......
ENDDO
RETURN creturn
1