关于字符串 递增进位方式与自动补位问题,求高手解!![已解决]
本帖最后由 kk_lee69 于 2014-11-28 16:14 编辑关于字符串 递增进位方式与自动补位问题,求高手解!!
假设 需要的 字符串 为 4位数,字符串的递增模式如下:
0000
0001
0002
……
0009
000A
000B
…….
000Z
000a
000b
…….
000z
0010
0011
…….
求当变数 $A=5时候 秀出 $B=0006 ,当 $A=1a 时候秀出 $B=001b
有快速的解法吗?? $str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
$tmp="1aZ"
$result=""
For $n=StringLen($tmp) To 1 Step -1
$i=StringInStr($str,StringMid($tmp,$n,1),1)
If $i<StringLen($str) Then
$result=StringLeft($tmp,$n-1)&StringMid($str,$i+1,1)&$result
ExitLoop
Else
$result="0"&$result
EndIf
Next
$result=StringRight("000"&$result,4)
MsgBox(0,"",$tmp&@TAB&$result)这个试下 这个试下
kevinch 发表于 2014-11-19 14:30 http://www.autoitx.com/images/common/back.gif
$tmp="zzz" 似乎不对 回复 2# kevinch
一個小Z 兩個 小Z 三個小Z都會出現 0000 本帖最后由 kk_lee69 于 2014-11-19 15:34 编辑
網上有找到62 進位的 VB 語法可惜 我不懂 VB {:face (229):}
N進位轉換
說明:
strArr變數,這個很重要喔,想要使用此程式的人要特別注意這個變數的涵義,裡面的值代表著進位轉換的符號,變數裡的字元數也就是代表著進位數,如果你是要換算十六進位當然把變數的值改為 0123456789ABCDEF(PS:注意我裡面有寫 String2Int這個方法要注意到如果是16進位請將值統一轉為大寫或小寫以免判斷符號時找不到符號 )。
'''
''' 62進位 Int64 Convert String
''' Ex:
''' Int2String(218340105584896) = "zzzzzzzz"
'''
''' Decimal''' 62 String
Private Shared Function Int2String(intValue As Int64) As
Dim strValue As = .Empty
Dim strArr As = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
While intValue <> 0
Dim intRem As Integer = 0
intRem = CInt(intValue Mod strArr.Length)
strValue = strArr.Substring(intRem, 1) + strValue
intValue /= strArr.Length
End While
Return strValue
End Function
'''
''' 62進位 String Convert Int64
''' Ex:
''' String2Int("zz") = 3843
'''
''' 62 String''' Decimal
Private Shared Function String2Int(strValue As ) As Int64
Dim regex As New System.Text.RegularExpressions.Regex("[^a-zA-Z0-9]")
If Not regex.IsMatch(strValue) Then
Dim intValue As Int64 = 0
Dim strArr As = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
' 去除前端0
For i As Integer = 0 To strValue.Length - 1
If strValue.Substring(i, 1) <> "0" Then
strValue = strValue.Substring(i, strValue.Length - i)
Exit For
End If
Next
For i As Integer = 0 To strValue.Length - 1
Dim intIndexOf As Integer = strArr.IndexOf(strValue.Substring(i, 1))
Dim intBon As Int64 = 0
intBon = (strValue.Length - 1 - i)
intBon = DirectCast(Math.Pow(strArr.Length, intBon), Int64)
intValue += intIndexOf * intBon
Next
Return intValue
Else
Return 0
End If
End Function
stringformat 回复 1# kk_lee69
楼主老是问这种高大上的问题,我真能观看了~~ 如果$A与$B是相同进制的话,不就一一对应了吗?$A加1再补齐0就行了。 62进制、10进制的互转问题。先将给定的62进制数转为10进制数,10进制数加1之后再转为62进制。 $str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
$tmp="zzz"
$result=""
$finished=False
For $n=StringLen($tmp) To 1 Step -1
$i=StringInStr($str,StringMid($tmp,$n,1),1)
If $i<StringLen($str) Then
$result=StringLeft($tmp,$n-1)&StringMid($str,$i+1,1)&$result
$finished=True
ExitLoop
Else
$result="0"&$result
EndIf
Next
If Not $finished Then $result="1"&$result
$result=StringRight("000"&$result,4)
MsgBox(0,"",$tmp&@TAB&$result)加个判断上去就行了 凑个热闹, 不会进制转换,纯当作字符串处理了.Local $tmp = '1zzz'
Local $r = _plus_one($tmp)
MsgBox(0,@error, $r)
Func _plus_one($str, $iPos = 0)
If StringRegExp($str, '[\W_]') Then Return SetError(1, '', -1)
If $str == '' Then Return _carry($iPos)
Local $Scr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@"
Local $s_Last = StringRight($str, 1)
Local $s_remain = StringTrimRight($str, 1)
Local $sCarry = StringRegExpReplace($Scr, '(?i)^.*' & $s_Last & '(.).*, '\1')
If $sCarry == '@' Then Return _plus_one($s_remain, $iPos+1)
Local $tmp = ''
For $i = 1 To $iPos
$tmp &= '0'
Next
Return StringFormat('%04s',$s_remain & $sCarry & $tmp)
EndFunc
Func _carry($iCode)
If $iCode < 1 Or $iCode > 4 Then Return SetError(1, '', -2)
Local $sRe = '1'
For $i = 1 To $iCode
$sRe &= '0'
Next
Return StringFormat('%04s', $sRe)
EndFunc 找到 一個可能的解
請見http://www.autoitx.com/forum.php?mod=viewthread&tid=39183&highlight=%BD%F8%D6%C6
但是反而引發我另外一個疑問
根據 上面文章的 程式 我輸入 $A=62 採62 進制 但是轉換後是 10
但是我的認知 62 的62進制 不是應該 等於 Z 嗎??
根據以上說法 10的10進制是不是應該等同 0 一個位數嗎??
62=Z 應該是 62進制 還是63進制呢??
引用 邪恶海盗的程式碼
Func _NTo10($iValue, $iHex);将$iHex(<=36)进制数$iValue转换为10进制数
Local Const $KEY = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+@"
Local $iValueLen = StringLen($iValue), $sResult
If $iHex < 2 Or $iHex > StringLen($KEY) Then
Return SetError(1, 0, "")
EndIf
For $i = 1 To $iValueLen
$sResult+=(StringInStr($KEY, StringMid($iValue, $i, 1),1)-1)* ($iHex^($iValueLen-$i))
Next
Return $sResult
EndFunc ;==>_N2Dec
Func _10ToN($iValue, $iHex);将10进制数$iValue转换为$iHex(<=36)数
If $iHex < 2 Or $iHex > 65 Then
Return SetError(1, 0, "")
EndIf
Local Const $KEY = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+@"
Local $iMod, $sResult
While $iValue
$iMod = Mod($iValue, $iHex)
$sResult = StringMid($KEY, $iMod + 1, 1) & $sResult
$iValue = Int($iValue / $iHex)
WEnd
;Return StringFormat("(%d)%s", $iHex, $sResult)
Return $sResult
EndFunc 前来学习。。。。。。。。。。。。。 回复 12# kk_lee69
解就是 62進位法上面的資訊是對的
页:
[1]