找回密码
 加入
搜索
查看: 6095|回复: 13

[AU3基础] 关于字符串 递增进位方式与自动补位问题,求高手解!![已解决]

 火.. [复制链接]
发表于 2014-11-19 13:15:54 | 显示全部楼层 |阅读模式
本帖最后由 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

有快速的解法吗??
发表于 2014-11-19 14:30:40 | 显示全部楼层
$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)
这个试下
发表于 2014-11-19 15:05:36 | 显示全部楼层
这个试下
kevinch 发表于 2014-11-19 14:30



    $tmp="zzz" 似乎不对
 楼主| 发表于 2014-11-19 15:29:44 | 显示全部楼层
回复 2# kevinch

一個小Z 兩個 小Z 三個小Z  都會出現 0000
 楼主| 发表于 2014-11-19 15:31:48 | 显示全部楼层
本帖最后由 kk_lee69 于 2014-11-19 15:34 编辑

網上有找到62 進位的 VB 語法  可惜 我不懂 VB
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 [String]
 Dim strValue As [String] = [String].Empty
 Dim strArr As [String] = "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 [String]) 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 [String] = "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
发表于 2014-11-19 16:32:08 | 显示全部楼层
stringformat
发表于 2014-11-19 17:51:13 | 显示全部楼层
回复 1# kk_lee69


    楼主老是问这种高大上的问题,我真能观看了~~
发表于 2014-11-19 18:22:52 | 显示全部楼层
如果$A与$B是相同进制的话,不就一一对应了吗?$A加1再补齐0就行了。
发表于 2014-11-19 18:59:35 | 显示全部楼层
62进制、10进制的互转问题。先将给定的62进制数转为10进制数,10进制数加1之后再转为62进制。
发表于 2014-11-19 19:49:05 | 显示全部楼层
$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)
加个判断上去就行了
发表于 2014-11-19 20:17:35 | 显示全部楼层
凑个热闹, 不会进制转换,纯当作字符串处理了.
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
 楼主| 发表于 2014-11-20 00:03:01 | 显示全部楼层
找到 一個可能的解  
請見  http://www.autoitx.com/forum.php ... hlight=%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 
发表于 2014-11-20 15:32:30 | 显示全部楼层
前来学习。。。。。。。。。。。。。
 楼主| 发表于 2014-11-28 16:15:08 | 显示全部楼层
回复 12# kk_lee69

解就是 62進位法  上面的資訊是對的
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 12:43 , Processed in 0.078372 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表