Как вы конвертируете или сокращаете числа в Autohotkey (AHK)? (публикация ответов, сделанных группой autohotkey discord)

#autohotkey

#autohotkey

Вопрос:

Мне нужно было преобразовать числа в Autohotkey для игры, которую я создаю, и некоторые члены группы Autohotkey Discord смогли мне помочь. В частности, Виейра и Андреас @ Nasa: ~ $ sudo -я каждый придумал рабочее решение.

vieira

 print(GetFormatedNum(1234567890))
print(GetFormatedNum(1234567))
print(GetFormatedNum(1234))
print(GetFormatedNum(12))

GetFormatedNum(num) {
    for k, v in [{12:"T"},{9:"B"},{6:"M"},{3:"K"}] {
        for i, j in v
            if (num >= (10**i))
                return % SubStr(num/(10**i),1,5) j
    }
    return num
}
1.234B
1.234M
1.234K
12
  

андреас @ Nasa: ~ $ sudo -i

 InputBox, num, Num Input, Input the number you want to be converted
if num is not Integer
    return
MsgBox, % "Num is: " . num

MsgBox, % "this is converted: " . Converter.Convert(num)

return


class Converter {

    static 1 := "k"
    static 2 := "M"
    static 3 := "G"
    static 4 := "T"

    Convert(int){
        if int is not Integer
            Throw, Exception("Illegal type", -1)
        size := Floor(Floor(Log(int)) / 3)
        
        if(size == 0)
            return int

        While(true){
            Try {
                ending := this[size]
                break
            }
            Catch e {
                if(e.Message == "key to great")
                    size--
            }
        }

        return, Round(Floor(int / (10 ** (size * 3 - 1)))/ 10, 1) . Ending
        
    }

    __Get(vKey){
        if(vKey > 0)
            Throw, Exception("key to great")
        return, 0
    }

}
  

Я безмерно благодарен каждому из них, а также БоБо и elmodo7 за помощь мне этим утром.

Ответ №1:

андреас @ Nasa: ~ $ sudo -i

 InputBox, num, Num Input, Input the number you want to be converted
if num is not Integer
    return
MsgBox, % "Num is: " . num

MsgBox, % "this is converted: " . Converter.Convert(num)

return


class Converter {

    static 1 := "k"
    static 2 := "M"
    static 3 := "B"
    static 4 := "T"
    Convert(int){
        if int is not Integer
            Throw, Exception("Illegal type", -1)
        size := Floor(Floor(Log(int)) / 3)
        
        if(size == 0)
            return int

        While(true){
            Try {
                ending := this[size]
                break
            }
            Catch e {
                if(e.Message == "key to great")
                    size--
            }
        }

        return, Round(Floor(int / (10 ** (size * 3 - 1)))/ 10, 1) . Ending
        
    }

    __Get(vKey){
        if(vKey > 0)
            Throw, Exception("key to great")
        return, 0
    }

}
  

редактировать: лично все это выше моего понимания, но это решение является его окончательным ответом.

 conv := new Converter()

Loop, 10 {
    Random, num, 0, 2147483647
    num := num * 1000000
    Print("Num is: " . num . " and this is converted: " . conv.Convert(num))
}

return


class Converter {

    __New(){
        this.endingChars := new EndChars("k", "M", "G", "T") ; put the endings for each step here in the correct order...
    }

    Convert(int){
        if int is not Integer
            Throw, Exception("Illegal type", -1)
        size := Floor(Floor(Log(int)) / 3)
        
        if(size == 0)
            return int

        While(size > 0){
            Try {
                ending := this.endingChars[size]
                break
            }
            Catch e {
                size--
            }
        }

        return, Round(Floor(int / (10 ** (size * 3 - 1)))/ 10, 1) . ending
        
    }

}

class EndChars {
        
    __New(EndingChars*){
        for k, i in EndingChars
            this[k] := i
    }

    __Get(vKey){
        if(vKey > 0)
            Throw, Exception("key to great")
        return, 0
       }
    
}
  

и вы можете просто добавить следующий символ в строке в EndChars