将字符转换为数字
Converting characters to numbers
在我目前正在制作的程序中,我需要将某组字符转换为数字。这组字符容易变化,在转换中还包括大写字母,其中大写字母将转换为与特殊字符(如“#”、“&”、“$”等)不同的数字。数字遵循一个简单的模式; a = 1, b = 2, c = 3, 等等
我目前使用的方法是使用单独的:
If letter = "a" then
number = 1
End If
然而,这种方法写起来很麻烦,而且效率似乎有点低(就通过它运行 continuous/bulk 数量的字母而言)。在 VBScript 中(特别是在 VB Express 2010 中)是否有任何函数、sub 等可用于执行这样的操作?
如有疑问,请阅读给定 ASCII 字符的 documentation. The Asc()
function returns the character code:
>>> <b>WScript.Echo Asc("a")</b>
97
>>> <b>WScript.Echo Asc("A")</b>
65
另一种选择是创建具有所需映射的 dictionary:
Set map = CreateObject("Scripting.Dictionary")
map.Add "a", 1
map.Add "b", 2
...
可以这样使用:
>>> <b>WScript.Echo 地图("a")</b>
1个
>>> <b>WScript.Echo 地图("b")</b>
2
第 0 步:使用位置映射:
Option Explicit
' Start with a function working on a string that calls
' a character decode function
Function decodeS(s)
ReDim aTmp(Len(s) - 1)
Dim i
For i = 0 To UBound(aTmp)
aTmp(i) = decodeC(Mid(s, i + 1, 1))
Next
decodeS = aTmp
End Function
' naive decode via InStr/Index/Position
Function decodeC(c)
decodeC = InStr("abc", c)
End Function
WScript.Echo "acbbca", Join(decodeS("acbbca"))
第 1 步:受保护的位置映射:
' guarded decode via InStr/Index/Position
Function decodeC(c)
decodeC = -1
Dim p : p = InStr("abcdefghiA", c)
If p Then decodeC = p
End Function
WScript.Echo "acbbcAx", Join(decodeS("acbbcAx"))
第 2 步:位置映射“不起作用”,切换到查找:
' decode via parallel array and InStr/Index/Position
Dim gsC : gsC = "aAbBcC"
Dim gaC : gaC = Split("-1 1 10 2 20 3 30")
Function decodeC(c)
decodeC = CLng(gaC(InStr(gsC, c)))
End Function
WScript.Echo "CcBxbAa", Join(decodeS("CcBxbAa"))
第 3 步:您更喜欢查字典:
' decode via dictionary
Dim gdC : Set gdC = CreateObject("Scripting.Dictionary")
gdC("a") = 1
gdC("A") = 10
Function decodeC(c)
decodeC = -1
If gdC.Exists(c) Then decodeC = gdC(c)
End Function
WScript.Echo "CcBxbAa", Join(decodeS("CcBxbAa"))
在我目前正在制作的程序中,我需要将某组字符转换为数字。这组字符容易变化,在转换中还包括大写字母,其中大写字母将转换为与特殊字符(如“#”、“&”、“$”等)不同的数字。数字遵循一个简单的模式; a = 1, b = 2, c = 3, 等等
我目前使用的方法是使用单独的:
If letter = "a" then
number = 1
End If
然而,这种方法写起来很麻烦,而且效率似乎有点低(就通过它运行 continuous/bulk 数量的字母而言)。在 VBScript 中(特别是在 VB Express 2010 中)是否有任何函数、sub 等可用于执行这样的操作?
如有疑问,请阅读给定 ASCII 字符的 documentation. The Asc()
function returns the character code:
>>> <b>WScript.Echo Asc("a")</b>
97
>>> <b>WScript.Echo Asc("A")</b>
65
另一种选择是创建具有所需映射的 dictionary:
Set map = CreateObject("Scripting.Dictionary")
map.Add "a", 1
map.Add "b", 2
...
可以这样使用:
>>> <b>WScript.Echo 地图("a")</b>
1个
>>> <b>WScript.Echo 地图("b")</b>
2
第 0 步:使用位置映射:
Option Explicit
' Start with a function working on a string that calls
' a character decode function
Function decodeS(s)
ReDim aTmp(Len(s) - 1)
Dim i
For i = 0 To UBound(aTmp)
aTmp(i) = decodeC(Mid(s, i + 1, 1))
Next
decodeS = aTmp
End Function
' naive decode via InStr/Index/Position
Function decodeC(c)
decodeC = InStr("abc", c)
End Function
WScript.Echo "acbbca", Join(decodeS("acbbca"))
第 1 步:受保护的位置映射:
' guarded decode via InStr/Index/Position
Function decodeC(c)
decodeC = -1
Dim p : p = InStr("abcdefghiA", c)
If p Then decodeC = p
End Function
WScript.Echo "acbbcAx", Join(decodeS("acbbcAx"))
第 2 步:位置映射“不起作用”,切换到查找:
' decode via parallel array and InStr/Index/Position
Dim gsC : gsC = "aAbBcC"
Dim gaC : gaC = Split("-1 1 10 2 20 3 30")
Function decodeC(c)
decodeC = CLng(gaC(InStr(gsC, c)))
End Function
WScript.Echo "CcBxbAa", Join(decodeS("CcBxbAa"))
第 3 步:您更喜欢查字典:
' decode via dictionary
Dim gdC : Set gdC = CreateObject("Scripting.Dictionary")
gdC("a") = 1
gdC("A") = 10
Function decodeC(c)
decodeC = -1
If gdC.Exists(c) Then decodeC = gdC(c)
End Function
WScript.Echo "CcBxbAa", Join(decodeS("CcBxbAa"))