|
楼主 |
发表于 2019-8-11 18:33
|
显示全部楼层
有用的其实是两个自定义函数,拿出来得瑟一下,其实前辈们早都做出n遍了。
1.n进制转十进制(n进制数s$,进制n1∈[1,16]默认2),支持小数、负数。共2个参数。
- Public Function NToD#(s$, Optional n1% = 2) 'n进制转十进制(n进制数s$,进制n1∈[1,16]默认2),支持小数、负数
- Dim k&, i&, ii%, z#, c$, j&, pd As Boolean
- If n1 <= 0 Then NToD = 1 / 0: Exit Function
- pd = False
- j = -1
- If InStr(1, s, ".") Then k = InStr(1, s, ".") - 1 Else k = Len(s) '处理小数
- If Asc(Mid(s, 1, 1)) = 45 Then ii = 2 Else ii = 1 '处理负数
- For i = ii To Len(s)
- c = Mid(s, i, 1)
- If Not (Asc(c) >= 48 And Asc(c) <= 57) Then
- c = UCase(c)
- If Asc(c) > 54 + n1 Then NToD = 1 / 0: Exit Function '排除超限英文字母字符及超限非法字符
- If Asc(c) = 65 Then 'A
- c = "10"
- ElseIf Asc(c) = 66 Then 'B
- c = "11"
- ElseIf Asc(c) = 67 Then 'C
- c = "12"
- ElseIf Asc(c) = 68 Then 'D
- c = "13"
- ElseIf Asc(c) = 69 Then 'E
- c = "14"
- ElseIf Asc(c) = 70 Then 'F
- c = "15"
- ElseIf Asc(c) = 46 Then '.
- pd = True
- Else '排除Asc(c)<65的除“0123456789.”外的非法字符
- NToD = 1 / 0
- Exit Function
- End If
- ElseIf Asc(c) > 47 + n1 Then '排除超限阿拉伯数字字符
- NToD = 1 / 0
- Exit Function
- End If
- If pd Then
- j = j + 1
- z = z + Val(c) * n1 ^ (-j)
- Else
- z = z + Val(c) * n1 ^ (k - i)
- End If
- Next i
- If ii = 2 Then NToD = -1 * z Else NToD = z
- End Function
复制代码
2.十进制转n进制(十进制数x,进制n1∈[1,16]默认2,输出小数部分精度位数ws),支持小数、负数。共3个参数。
- Public Function DToN$(x#, Optional n1% = 2, Optional ws% = 4) '十进制转n进制(十进制数x,进制n1∈[1,16]默认2,输出小数部分精度位数ws),支持小数、负数
- Dim x1#, x2#, r%, i%, r1#, z$, szf, pd As Boolean, pd1 As Boolean
- If n1 < 1 Or ws < 1 Then
- DToN = 1 / 0: Exit Function
- ElseIf n1 = 1 Then
- DToN = 0: Exit Function
- End If
- szf = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
- If x < 0 Then pd = True: x = Abs(x) '处理负数
- If x <> Int(x) Then x2 = x - Int(x): x = Int(x): pd1 = True
- Do '处理整数部分
- r = x Mod n1
- z = szf(r) & z
- x1 = (x - r) / n1
- x = x1
- Loop Until x = 0
- If pd1 Then '处理小数部分
- z = z & "."
- For i = 1 To ws
- r1 = x2 * n1
- z = z & szf(Int(r1))
- x2 = r1 - Int(r1)
- If x2 = 0 Then Exit For
- Next i
- End If
- If pd Then DToN = "-" & z Else DToN = z
- End Function
复制代码
在“十转n”中曾考虑:“前置补0,统一位数长度输出”,比如输出5位长度时是00011,而不是11。后来又放弃了,转而处理小数了,呵呵,小数部分处理起来有点麻烦,目前最后一位采取简单的“截断”办法,而不是根据下一位和进制n判断所谓“四舍五入”(需调整到相应n进制下)。
|
评分
-
2
查看全部评分
-
|