MsgBox,262144,进制转换测试,% "10—>2:" DigitalConv.ConvertBase(10, 2, "25")
   . "`n10—>16:" DigitalConv.ConvertBase(10, 16, "44")
   . "`n10—>8 :" DigitalConv.ConvertBase(10, 8, "44")
   . "`n16—>10:" DigitalConv.ConvertBase(16, 10, "4E")
   . "`n16—>8 :" DigitalConv.ConvertBase(16, 8, "4E")
   . "`n16—>2 :" DigitalConv.ConvertBase(16, 2, "4E")
   . "`n2 —>10:" DigitalConv.ConvertBase(2, 10, "1011")
   . "`n2 —>16:" DigitalConv.ConvertBase(2, 16, "1011")
   . "`n2 —>8 :" DigitalConv.ConvertBase(2, 8, "1011")
   . "`n8 —>16:" DigitalConv.ConvertBase(8, 16, "35")
Loop
{
  Random, Number, 0.0, 10000000000000.0
  Number:=Format("{:.4f}",Number)
  MsgBox,262149,数字转换测试, % "Number:" Number
     . "`n数字大写:" DigitalConv.GetDigitalFormat(Number,True)
     . "`n数字小写:" DigitalConv.GetDigitalFormat(Number,False)
     . "`n金额转换:" DigitalConv.GetMoneyFormat(Number)
  IfMsgBox,Cancel
    Break
}

; By 蜜獾哥
Class DigitalConv
{
  static list:={DigitalTrad:{0:"零",1:"壹",2:"贰",3:"叁",4:"肆",5:"伍",6:"陆",7:"柒",8:"捌",9:"玖"}
    ,DigitalSimp:{0:"〇",1:"一",2:"二",3:"三",4:"四",5:"五",6:"六",7:"七",8:"八",9:"九"}
    ,AmountUnits:["","万","亿","兆","京","垓"]
    ,UnitsTrad:["","萬","億","兆","京","垓"]}
  ;;大小写转换
  GetDigitalFormat(Num,trad:=False){
    Local String
    String:=""
    if Num~="[^0-9.]"
      Return ""
    if InStr(Num,"."){
      len:=StrLen(Integer:=StrSplit(Num,".")[1]),decimal:=StrSplit(Num,".")[2]
    }Else
      len:=StrLen(Integer:=Num)
    DllCall("msvcrt.dll\_wcsrev", "Ptr", &Integer, "CDecl")
    Integer:=Trim(RegExReplace(Integer,"(\d{4})","$1,"),",")
    Loop,Parse,Integer,`,
    {
      if (A_LoopField<>"") {
        if Item:=this.FormatDigital(A_LoopField,trad?["拾","佰","仟"]:["十","百","千"],True,trad)
          String.= (trad?this.List.UnitsTrad[A_Index]:this.List.AmountUnits[A_Index]) Item
      }
    }
    DllCall("msvcrt.dll\_wcsrev", "Ptr", &String, "CDecl")	;;字符反转
    String:=RegExReplace(RegExReplace(String,(trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0]) "{2,}",(trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0])),(trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0]) "(?=" (trad?this.List.UnitsTrad[2]:this.List.AmountUnits[2]) "|" (trad?this.List.UnitsTrad[3]:this.List.AmountUnits[3]) "|" (trad?this.List.UnitsTrad[4]:this.List.AmountUnits[4]) "|" (trad?this.List.UnitsTrad[5]:this.List.AmountUnits[5]) "|" (trad?this.List.UnitsTrad[6]:this.List.AmountUnits[6]) ")")
    String:=RegExReplace(String,(trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0]) "+$|^" (trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0]))
    if decimal {
      String.= trad?"點":"点"
      Loop,Parse,decimal
        String.= trad?this.List.DigitalTrad[A_LoopField]:this.List.DigitalSimp[A_LoopField]
    }
    Return RegExReplace(String,"^" . (trad?this.List.DigitalTrad[1]:this.List.DigitalSimp[1]) . (trad?"拾":"十"),trad?"拾":"十")
  }
  ;;金额转换
  GetMoneyFormat(Num){
    Local String
    String:=""
    if Num~="[^0-9.]"
      Return ""
    if InStr(Num,"."){
      len:=StrLen(Integer:=StrSplit(Num,".")[1]),decimal:=StrSplit(Num,".")[2]
    }Else
      len:=StrLen(Integer:=Num)
    DllCall("msvcrt.dll\_wcsrev", "Ptr", &Integer, "CDecl")
    Integer:=Trim(RegExReplace(Integer,"(\d{4})","$1,"),",")
    Loop,Parse,Integer,`,
    {
      if (A_LoopField<>"") {
        if Item:=this.FormatDigital(A_LoopField,["拾","佰","仟"])
          String.= this.List.AmountUnits[A_Index] Item
      }
    }
    DllCall("msvcrt.dll\_wcsrev", "Ptr", &String, "CDecl")	;;字符反转
    String:=RegExReplace(RegExReplace(String,this.List.DigitalTrad[0] "{2,}",this.List.DigitalTrad[0]),this.List.DigitalTrad[0] "(?=" this.List.AmountUnits[2] "|" this.List.AmountUnits[3] "|" this.List.AmountUnits[4] "|" this.List.AmountUnits[5] "|" this.List.AmountUnits[6] ")")
    String:=RegExReplace(String,this.List.DigitalTrad[0] "+$|^" this.List.DigitalTrad[0])
    if decimal {
      if Item:=this.FormatDigital(decimal,["角","分","厘","毫"],False){
        String.= "元" Item
        String:=RegExReplace(String,this.List.DigitalTrad[0] "(角|分|厘|毫)",this.List.DigitalTrad[0])
        String:=RegExReplace(String,this.List.DigitalTrad[0] "+$|^" this.List.DigitalTrad[0])
      }Else
        String.="元整"
    }Else{
      String.="元整"
    }
    Return RegExReplace(String,"^" this.List.DigitalTrad[1] "拾","拾")
  }
  ;;千分位匹配
  FormatDigital(Num,Units,Reverse:=True,trad:=True){
    Local String
    String:=""
    if (Num~="^\d+$") {
      Loop,% StrLen(Num)
      {
        if (SubStr(Num,A_Index,1)<>""){
          String.=(trad?this.List.DigitalTrad[SubStr(Num,A_Index,1)]:this.List.DigitalSimp[SubStr(Num,A_Index,1)]) . (!Reverse?SubStr(Num,A_Index,1)?Units[A_Index]:trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0]:SubStr(Num,A_Index+1,1)?Units[A_Index]:"")
        }
      }
    }
    String:=RegExReplace(String,(trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0]) "{2,}",trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0])
    Return StrLen(Num)-1<objlength(Units)? String . (trad?this.List.DigitalTrad[0]:this.List.DigitalSimp[0]):String
  }
  
  ;;2—36进制互转
  ConvertBase(InBase, OutBase, nptr){
    static u := A_IsUnicode ? "_wcstoui64" : "_strtoui64"
    static v := A_IsUnicode ? "_i64tow"    : "_i64toa"
    VarSetCapacity(s, 66, 0)
    value := DllCall("msvcrt.dll\" u, "Str", nptr, "UInt", 0, "UInt", InBase, "CDECL Int64")
    DllCall("msvcrt.dll\" v, "Int64", value, "Str", s, "UInt", OutBase, "CDECL")
    return s
  }
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。