用VB编写一个将n进制整数转换成十进制数的通用程序!

用VB编写一个将n进制整数转换成十进制数的通用程序
2024-12-04 07:06:03
推荐回答(3个)
回答(1):

重点是要学会如何利用按权展开式求和,算法了解了,代码就不难了。


Dim a As String, aa As Integer, b As String, bb As Integer, c As Integer
aa = InputBox("输入的是几进制数?")
aa = Trim(aa)
a = InputBox("数是多少?")
a = Trim(a)
For i = 1 To Len(a)
    b = Mid(a, i, 1)
    If (b > 9) Then
        bb = 10 + b - Asc("A")
    Else
        bb = Val(b)
    End If
                                                                    
    c = c + bb * aa ^ (Len(a) - i)
Next i
MsgBox "结果是:" & c

回答(2):

临时写的,简单测试通过。

注释也应该写全了,复制直接可用。

有什么不清楚的,追问好了。

Option Explicit
' 最大支持36进制,因为超过这个进制不知道以什么字符来表示了
' 字符表示:
'   11进制: A=10
'   12进制: B=11
'   13进制: C=12
'   14进制: D=13
'   15进制: E=14
'   16进制: F=15
'   17进制: H=16
'   18进制: I=17
'   依次类推
' 参数:
'   Text    需要转换的字符串
'           字符串首字符为(-)时,作为负数进行计算。
'           字符串前2字符为(0x, &H, &O)时,自动转换进制为其相应的进制。
'   Radix   需要转换为的进制基数(可选输入参数:默认值为10进制)
' 返回:
'   有符号8字节整数
'   为调用时可以获得到转换失败,所以内部没有做融错处理
'   调用时可以使用On Error捕获错误后,给出默认数值
Public Function ToDec(ByVal Text As String, Optional Radix As Integer = 10) As Currency
    Const Chars As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                                                                                      
    ' 变量声明
    Dim i As Long
    Dim Index As Integer
    Dim Length As Long
    Dim Sign As Long
    Dim Result As Currency
    
    ' 初始化
    Text = UCase(Text)
    Length = Len(Text)
    Sign = 1
    Result = 0
                                                                                      
    ' 符号位检查
    If Length >= 1 Then
        If Mid(Text, 1, 1) = "-" Then
            Sign = -1
            Text = Mid(Text, 2)
            Length = Length - 1
        End If
    End If
                                                                                      
    ' 进制表达式检查
    If Length >= 2 Then
        Select Case Mid(Text, 1, 2)
        Case "0x" ' 16进制(C)
            Radix = 16
            Text = Mid(Text, 3)
            Length = Length - 2
                                                                                          
        Case "&H", "&h" ' 16进制(Basic)
            Radix = 16
            Text = Mid(Text, 3)
            Length = Length - 2
                                                                                          
        Case "&O", "&o" ' 8进制(Basie)
            Radix = 8
            Text = Mid(Text, 3)
            Length = Length - 2
                                                                                          
        End Select
    End If
                                                                                      
    ' 转换每个字符
    For i = 1 To Length                                                                                   
        Index = InStr(Chars, Mid(Text, i, 1)) - 1
        If Index = -1 Then
            Exit For
        ElseIf Index > Radix Then
            Exit For
        End If
                                                                                          
        Result = Result * Radix + Index                                                                                     
    Next
                                                                                      
    ' 符号位处理
    Result = Result * Sign
                                                                                      
    ' 返回
    ToDec = Result
End Function

Private Sub Form_Load()
   
    ' 测试
    MsgBox ToDec("-&HFF")     ' Return -255
    MsgBox ToDec("-FF", 16)   ' Return -255
    MsgBox ToDec("-&HFF", 15) ' Return -255
    MsgBox ToDec("-FF", 15)   ' Return -240
    MsgBox ToDec("-FF", 11)   ' Return 0
    MsgBox ToDec("-FF")       ' Return 0
    
    End
End Sub

回答(3):

你这个n是指任意的数吗?如果是,那么就有个难点,假如n大于10,那么用什么符号来表示大于10小于n的数?我们知道16进制数用ABCDEF表示10到15这6个数,那么36进制呢?用10个阿拉伯数字+26个字母?那么再大呢?……所以我认为这个n不能是任意的数。
如果是常用的二进制、八进制、十六进制,那么就好办得多:

Function Nto10(s As String, n As Integer) As Long
If n = 8 Then
Nto10 = Val("&O" & s)
ElseIf n = 16 Then
Nto10 = Val("&H" & s)
ElseIf n = 2 Then
Dim i As Integer
For i = 1 To Len(s)
Nto10 = Nto10 + Val(Mid(s, i, 1)) * 2 ^ (Len(s) - i)
Next
Else
Nto10 = 0
End If
End Function

调用方法:
16进制: MsgBox Nto10("6B3F", 16)
8进制: MsgBox Nto10("1356", 8)
2进制: MsgBox Nto10("10011010", 2)