vb6计算器代码

VB6计算器

这是我年轻时候的一个作品,初衷是为了要处理超长数字的运算,8字节无符的那种,
可是咱VB没有那种类型不是,最长的double也只能处理8字节有符数,还是有精度损失的。
当时也不太懂,没办法,就编了这个计算器,用字符串做参数进行运算,运算效率低那是当然了,牺牲速度换取功能呗,贻笑大方啦。

现在明白了,其实,VB有Variant类型可以进行超长字符运算的,不信大家可以试试哦。

Dim Num As Variant
Dim highl As Variant
Dim lowl As Variant

Num = CDec(highl) * CDec(2 ^ 32) + CDec(lowl)

GetInt8Str = CStr(Num)

clsStringMath:


Option Explicit

'函数列表:
'
'
'字符加法 (jw=进位)
'Public Function CharAdd(s1 As String, s2 As String, jw As Boolean) As String
'例:?CharAdd("9","5",True)
' 15
'
'字符串加法
'Public Function StringAdd(s1 As String, s2 As String) As String
'例:?StringAdd("9999999", "2")
' 10000001
'
'字符减法 (minus=负号)
'Public Function CharSubtraction(s1 As String, s2 As String, ByRef minus As Boolean) As String
'例:?StringAdd("2", "3")
' 1,minus=true
'
'字符串减法 (minus=负号)
'Public Function StringSubtraction(ss1 As String, ss2 As String, minus As Boolean) As String
'例:?StringAdd("1234", "23423")
' 22189,minus=true
'
'字符乘法 (jw=进位)
'Public Function CharMultiple(s1 As String, s2 As String, jw As String) As String
'例:?CharMultiple("9", "9", "5")
' 86
'
'字符串乘法
'Public Function StringMultiple(s1 As String, s2 As String) As String
'例:?StringMultiple("156", "78")
' 12168
'
'字符除法
'Public Function CharDevide(s1 As String, s2 As String, ByRef ys As String) As String
'例:?CharDevide("19", "3",ys)
' 6,ys=1
'
'字符串除法
'Public Function StringDevide(s1 As String, s2 As String, ByRef ys As String) As String
'例:?StringDevide("156", "75", ys)
' 2,ys=6
'
'比较大小 ,s1>s2 =1,s1'Public Function StringBigger(s1 As String, s2 As String) As String
'例:?StringBigger("156", "75")
' 1
'
'字符串指数
'Public Function StringIndex(X As String, IndexString As String) As String
'例:?StringIndex("16", "4")
' 65536
'
'十六进制转十进制
'Public Function StringFromHex(HexString As String) As String
'例:?StringFromHex("ffFFffFFffFFffFF")
' 18446744073709551615
'
'十六进制转字符数组'''''''''''''''''''''''
'Public Function HexStringToBuff(HexString As String, Buff() As Byte, ByRef BuffLen As String) As String
'例:?HexStringToBuff("155450",buff,bufflen)
' 100101111100111010,bufflen=3,buff(0)=2,buff(1)=95,buff(2)=58
'
'


'''加法'''''''''''''''''''''''
Public Function CharAdd(s1 As String, s2 As String, jw As Boolean) As String

Dim ss1 As String, ss2 As String, s As String
Dim l1 As Integer, l2 As Integer, l As Integer

Dim i As Integer

If s1 = "" Or s2 = "" Or IsNumeric(s1) = False Or IsNumeric(s2) = False Then
CharAdd = ""
Exit Function
End If

ss1 = Left(s1, 1)
ss2 = Left(s2, 1)

l1 = CInt(ss1)
l2 = CInt(ss2)

If jw = True Then
l = l1 + l2 + 1
Else
l = l1 + l2
End If

s = Format(l, "00")
CharAdd = s

End Function

Public Function StringAdd(s1 As String, s2 As String) As String

Dim l1 As Integer, l2 As Integer, l As Integer
Dim i As Integer, j As Integer
Dim s As String, ss As String
Dim jw As Boolean, oldjw As Boolean

If s1 = "" Or s2 = "" Or IsNumeric(s1) = False Or IsNumeric(s2) = False Then
StringAdd = ""
Exit Function
End If

l1 = Len(s1)
l2 = Len(s2)
If l2 > l1 Then
l = l2
For i = 1 To l - l1
s1 = "0" & s1
Next i
Else
l = l1
For i = 1 To l - l2
s2 = "0" & s2
Next i
End If

jw = False
For i = 0 To l - 1
j = l - i

s = CharAdd(Mid(s1, j, 1), Mid(s2, j, 1), jw)

If Left(s, 1) = 1 Then
jw = True
Else
jw = False
End If
ss = Right(s, 1) & ss
Next i
If jw = True Then
ss = "1" & ss
End If

StringAdd = ss

End Function



'''乘法'''''''''''''''''''''''
Public Function CharMultiple(s1 As String, s2 As String, jw As String) As String

Dim ss1 As String, ss2 As String, ss3 As String, s As String
Dim l1 As Integer, l2 As Integer, l3 As Integer, l As Integer
Dim i As Integer

If s1 = "" Or s2 = "" Or IsNumeric(s1) = False Or IsNumeric(s2) = False Or IsNumeric(jw) = False Then
CharMultiple = ""
Exit Function
End If

ss1 = Left(s1, 1)
ss2 = Left(s2, 1)
ss3 = Left(jw, 1)

l1 = CInt(ss1)
l2 = CInt(ss2)
l3 = CInt(ss3)

If l3 > 0 Then
l = l1 * l2 + l3
Else
l = l1 * l2
End If

s = Format(l, "00")
CharMultiple = s

End Function

Public Function StringMultiple(s1 As String, s2 As String) As String

Dim l1 As Integer, l2 As Integer, l As Integer
Dim i As Integer, j As Integer, ii As Integer, jj As Integer
Dim s As String, ss() As String, sss As String
Dim jw As String

If s1 = "" Or s2 = "" Or IsNumeric(s1) = False Or IsNumeric(s2) = False Then
StringMultiple = ""
Exit Function
End If

l1 = Len(s1)
l2 = Len(s2)
ReDim ss(1 To l2)

For j = 1 To l2
jw = "0"
For i = 1 To l1
ii = l1 - (i - 1)
jj = l2 - (j - 1)
s = CharMultiple(Mid(s1, ii, 1), Mid(s2, jj, 1), jw)
jw = Left(s, 1)
ss(j) = Right(s, 1) & ss(j)

Next i
If Left(s, 1) <> "0" Then
ss(j) = Left(s, 1) & ss(j)
End If
For i = 1 To j - 1
ss(j) = ss(j) & "0"
Next i
Next j

sss = "0"
For i = 1 To l2
sss = StringAdd(sss, ss(i))
Next i

StringMultiple = sss

End Function

'''指数'''''''''''''''''''''''
Public Function StringIndex(X As String, IndexString As String) As String

Dim l1 As Integer, i As Integer
Dim s As String

If X = "" Or IndexString = "" Or IsNumeric(X) = False Or IsNumeric(IndexString) = False Then
StringIndex = ""
Exit Function
End If

l1 = CInt(IndexString)
s = "1"
For i = 1 To l1
s = StringMultiple(s, X)
Next i
StringIndex = s

End Function

'''十六进制转十进制'''''''''''''''''''''''
Public Function StringFromHex(HexString As String) As String

Dim l1 As Integer, i As Integer, ii As Integer
Dim s1 As String, s2 As String, s As String

If HexString = "" Then
StringFromHex = ""
Exit Function
End If

l1 = Len(HexString)
s = "0"
For i = 1 To l1
ii = l1 - i + 1
s1 = Mid(HexString, ii, 1)

If UCase(s1) = "0" Then
s1 = "0"
ElseIf UCase(s1) = "1" Then
s1 = "1"
ElseIf UCase(s1) = "2" Then
s1 = "2"
ElseIf UCase(s1) = "3" Then
s1 = "3"
ElseIf UCase(s1) = "4" Then
s1 = "4"
ElseIf UCase(s1) = "5" Then
s1 = "5"
ElseIf UCase(s1) = "6" Then
s1 = "6"
ElseIf UCase(s1) = "7" Then
s1 = "7"
ElseIf UCase(s1) = "8" Then
s1 = "8"
ElseIf UCase(s1) = "9" Then
s1 = "9"
ElseIf UCase(s1) = "A" Then
s1 = "10"
ElseIf UCase(s1) = "B" Then
s1 = "11"
ElseIf UCase(s1) = "C" Then
s1 = "12"
ElseIf UCase(s1) = "D" Then
s1 = "13"
ElseIf UCase(s1) = "E" Then
s1 = "14"
ElseIf UCase(s1) = "F" Then
s1 = "15"
Else
s1 = "0"
End If
s2 = StringIndex("16", Format(i - 1, "0"))
s2 = StringMultiple(s1, s2)
s = StringAdd(s, s2)
Next i
StringFromHex = s

End Function


'''减法'''''''''''''''''''''''
Public Function CharSubtraction(s1 As String, s2 As String, ByRef minus As Boolean) As String

Dim ss1 As String, ss2 As String, s As String
Dim l1 As Integer, l2 As Integer, l As Integer
Dim i As Integer

If s1 = "" Or s2 = "" Or IsNumeric(s1) = False Or IsNumeric(s2) = False Then
CharSubtraction = ""
Exit Function
End If

ss1 = Left(s1, 2)
ss2 = Left(s2, 1)

l1 = CInt(ss1)
l2 = CInt(ss2)

If l1 < l2 Then

minus = True
Else
minus = False
End If

l = Abs(l1 - l2)
s = Format(l, "0")

CharSubtraction = s

End Function

Public Function StringSubtraction(ss1 As String, ss2 As String, minus As Boolean) As String

Dim l1 As Integer, l2 As Integer, l As Integer
Dim i As Integer, j As Integer
Dim s As String, ss As String, st As String
Dim s1 As String, s2 As String
Dim ms As Boolean, jw As Boolean, jw2 As Boolean

If ss1 = "" Or ss2 = "" Or IsNumeric(ss1) = False Or IsNumeric(ss2) = False Then
StringSubtraction = ""
Exit Function
End If

If StringBigger(ss1, ss2) <> "1" Then
s1 = ss2
s2 = ss1
Else
s1 = ss1
s2 = ss2
End If

l1 = Len(s1)
l2 = Len(s2)
If l2 > l1 Then
l = l2
For i = 1 To l - l1
s1 = "0" & s1
Next i
Else
l = l1
For i = 1 To l - l2
s2 = "0" & s2
Next i
End If

ms = False
jw = False
For i = 0 To l - 1
j = l - i

If jw = True Then
st = CharSubtraction(Mid(s1, j, 1), "1", jw)
If jw = True Then
st = CharSubtraction("1" & Mid(s1, j, 1), "1", jw2)
End If
Else
st = Mid(s1, j, 1)
End If
s = CharSubtraction(st, Mid(s2, j, 1), ms)
If ms = True Then
s = CharSubtraction("1" & st, Mid(s2, j, 1), ms)
jw = True
End If

ss = Right(s, 1) & ss
Next i
If jw = True Then
minus = True
End If

For i = 1 To Len(ss)
If Mid(ss, i, 1) <> "0" Then
Exit For
End If
Next i
If (i <> 1) And (ss <> "0") Then
s = Mid(ss, i, Len(ss) - i + 1)
Else
s = ss
End If

If StringBigger(ss1, ss2) = "-1" Then
minus = True
End If

StringSubtraction = s

End Function

'''除法'''''''''''''''''''''''
Public Function CharDevide(s1 As String, s2 As String, ByRef ys As String) As String

Dim ss1 As String, ss2 As String, sz As String, sy As String
Dim l1 As Integer, l2 As Integer, lz As Integer, ly As Integer, l As Integer
Dim i As Integer

If s1 = "" Or s2 = "" Or IsNumeric(s1) = False Or IsNumeric(s2) = False Then
CharDevide = ""
Exit Function
End If

ss1 = Left(s1, 1)
ss2 = Left(s2, 1)

l1 = CInt(ss1)
l2 = CInt(ss2)

lz = l1 \ l2
ly = l1 Mod l2

sz = Format(lz, "0")
sy = Format(ly, "0")

ys = sy
CharDevide = sz


End Function

Public Function StringDevide(s1 As String, s2 As String, ByRef ys As String) As String

Dim ss1 As String, ss2 As String, sz As String, sy As String
Dim l1 As Integer, l2 As Integer, lz As Inte

ger, ly As Integer, l As Integer
Dim i As String
Dim minus As Boolean

If s1 = "" Or s2 = "" Or IsNumeric(s1) = False Or IsNumeric(s2) = False Then
StringDevide = ""
Exit Function
End If

ys = "0"
ss1 = s1
ss2 = s2
i = "0"
Do While (StringBigger(ss2, ss1) = "-1") Or (StringBigger(ss2, ss1) = "0")
ss1 = StringSubtraction(ss1, ss2, minus)
i = StringAdd(i, "1")
Loop

sz = i
sy = ss1

ys = sy
StringDevide = sz

End Function

'''比较大小'''''''''''''''''''''''
Public Function StringBigger(s1 As String, s2 As String) As String

Dim ss1 As String, ss2 As String, sz As String, sy As String
Dim l1 As Integer, l2 As Integer, la As Integer, lb As Integer, l As Integer
Dim i As Integer

If s1 = "" Or s2 = "" Or IsNumeric(s1) = False Or IsNumeric(s2) = False Then
StringBigger = ""
Exit Function
End If

l1 = Len(s1)
l2 = Len(s2)

If l1 < l2 Then
StringBigger = "-1"
Exit Function
ElseIf l1 > l2 Then
StringBigger = "1"
Exit Function
End If

For i = 1 To l1
ss1 = Mid(s1, i, 1)
ss2 = Mid(s2, i, 1)
If ss1 <> ss2 Then
la = CInt(ss1)
lb = CInt(ss2)
If la < lb Then
StringBigger = "-1"
Else
StringBigger = "1"
End If
Exit Function
End If
Next i
StringBigger = "0"

End Function

'''十六进制转字符数组'''''''''''''''''''''''
Public Function HexStringToBuff(HexString As String, Buff() As Byte, ByRef BuffLen As String) As String

Dim s As String, sx As String, ys As String, yys As String
Dim l As Long, ll As Long, m As Long, i As Long, j As Long

If HexString = "" Then
HexStringToBuff = ""
Exit Function
End If

sx = HexString
ys = ""
yys = ""
Do While (sx <> "1")
sx = StringDevide(sx, "2", ys)
yys = ys & yys
Loop
yys = sx & yys

l = Len(yys)
If l Mod 8 = 0 Then
ll = l \ 8
Else
ll = l \ 8 + 1
End If

ReDim Buff(0 To ll - 1)

For i = 1 To l
j = l - i + 1
If Mid(yys, j, 1) = "1" Then
Buff(ll - (i \ 8) - 1) = Buff(ll - (i \ 8) - 1) Or (2 ^ ((i Mod 8) - 1))
Else
Buff(ll - (i \ 8) - 1) = Buff(ll - (i \ 8) - 1) And Not (2 ^ ((i Mod 8) - 1))
End If
Next i
BuffLen = ll

HexStringToBuff = yys

End Function

'''BCD码转数值'''''''''''''''''''''''
Public Function BCDStringToDbl(BCDString As String) As Double

Dim d As Double

If BCDString = "" Or IsNumeric(BCDString) = False Then
BCDStringToDbl = ""
Exit Function
End If

d = CDbl(BCDString)


BCDStringToDbl = d

End Function





相关文档
最新文档