wake-up-neo.net

Wie konvertiert man in Java eine Dezimalzahl in Basis 36?

Wie kann ich eine Dezimalzahl in Java in Basis 36 konvertieren?

41
slavoj

Verwenden Sie bei einer gegebenen Zahl iInteger.toString(i, 36).

73

Weitere Informationen finden Sie in der Dokumentation zu Integer.toString

http://docs.Oracle.com/javase/7/docs/api/Java/lang/Integer.html#toString(int,%20int)

toString

public static String toString(int i, int radix)
....
The following ASCII characters are used as digits:

   0123456789abcdefghijklmnopqrstuvwxyz

Was ist radix? Sie haben Glück für Base 36 (und es macht Sinn)
http://docs.Oracle.com/javase/7/docs/api/Java/lang/Character.html#MAX_RADIX

public static final int     MAX_RADIX   36
16
RichardTheKiwi

Folgendes kann für jede Basis funktionieren, nicht nur für 36. Ersetzen Sie einfach den String-Inhalt von code.

Kodieren:

int num = 586403532;
String code = "0123456789abcdefghijklmnopqrstuvwxyz";
String text = "";
j = (int)Math.ceil(Math.log(num)/Math.log(code.length()));
for(int i = 0; i < j; i++){
    //i goes to log base code.length() of num (using change of base formula)
    text += code.charAt(num%code.length());
    num /= code.length();
}

Dekodieren:

String text = "0vn4p9";
String code = "0123456789abcdefghijklmnopqrstuvwxyz";
int num = 0;
j = text.length
for(int i = 0; i < j; i++){
    num += code.indexOf(text.charAt(0))*Math.pow(code.length(), i);
    text = text.substring(1);
}
12
hcps-tenembasj

Zuerst müssen Sie Ihre Nummer in das interne Zahlenformat von Java konvertieren (was zufällig 2-basiert ist, aber das spielt hier keine Rolle), zum Beispiel durch Integer.parseInt() (wenn Ihre Nummer eine Ganzzahl kleiner als 2 ^ 31 ist). . Dann können Sie es von int in das gewünschte Ausgabeformat konvertieren. Die Methode Integer.toString(i, 36) verwendet dazu 0123456789abcdefghijklmnopqrstuvwxyz als Ziffern (Dezimalstellen 0-9 und englische Kleinbuchstaben in alphabetischer Reihenfolge). Wenn Sie andere Ziffern wünschen, können Sie entweder das Ergebnis konvertieren, indem Sie die "Ziffern" ersetzen (zum Beispiel toUpperCase), oder die Konvertierung selbst vornehmen. mit einem Nachschlag der rechten Ziffer).

Wenn Ihre Nummer länger ist als das, was int anbietet, können Sie stattdessen long (mit Long) oder BigInteger verwenden. Sie haben ähnliche Radix-Konverter.

Wenn Ihre Zahl "Ziffern hinter dem Punkt" hat, ist es etwas schwieriger, da die meisten (endlichen) Basis-X-Zahlen nicht exakt als (endliche) Basis-Y-Zahlen darstellbar sind, wenn (eine Potenz von) Y nicht ist ein Vielfaches von X.

9
Paŭlo Ebermann

Dieser Code funktioniert:

public class Convert {

    public static void main(String[] args) {
        int num= 2147483647;
        String text="ABCD1";


        System.out.println("num: " + num + "=>" + base10ToBase36(num));
        System.out.println("text: " +text + "=>" + base36ToBase10(text));
    }

    private static String codeBase36 = "0123456789abcdefghijklmnopqrstuvwxyz";

    //"0123456789 abcdefghij klmnopqrst uvwxyz"
    //"0123456789 0123456789 0123456789 012345"


    private static String max36=base10ToBase36(Integer.MAX_VALUE); 

    public static String base10ToBase36(int inNum) {
        if(inNum<0) {
            throw new NumberFormatException("Value  "+inNum +"  to small");
        }
        int num = inNum;
        String text = "";
        int j = (int)Math.ceil(Math.log(num)/Math.log(codeBase36.length()));
        for(int i = 0; i < j; i++){
            text = codeBase36.charAt(num%codeBase36.length())+text;
            num /= codeBase36.length();
        }
        return text;
    }
    public  static int base36ToBase10(String in) {
        String text = in.toLowerCase();
        if(text.compareToIgnoreCase(max36)>0) {
            throw new NumberFormatException("Value  "+text+"  to big");
        }

        if(!text.replaceAll("(\\W)","").equalsIgnoreCase(text)){
            throw new NumberFormatException("Value "+text+" false format");
        }
        int num=0;
        int j = text.length();
        for(int i = 0; i < j; i++){
            num += codeBase36.indexOf(text.charAt(text.length()-1))*Math.pow(codeBase36.length(), i);
            text = text.substring(0,text.length()-1);
        }
        return num;
    }


}
1
frank

Wenn Sie nicht Integer.toString (Num, base) verwenden möchten, in meinem Fall, für den ich eine 64-Bit-Variable benötigte, können Sie folgenden Code verwenden: Die Verwendung von Listen in Java erleichtert diese Konvertierung

long toBeConverted=10000; // example, Initialized by 10000
List<Character> charArray = new ArrayList<Character>();
List<Character> charArrayFinal = new ArrayList<Character>();
int length=10; //Length of the output string
long base = 36;

            while(toBeConverted!=0)
            {
                long rem = toBeConverted%base;
                long quotient = toBeConverted/base;
                if(rem<10)
                    rem+=48;
                else
                    rem+=55;
                charArray.add((char)rem);
                toBeConverted=quotient;
            }
            // make the array in the reverse order
            for(int i=length-1;i>=0;--i){
                if(i>=charArray.size()){
                    charArrayFinal.add((char) 48); // sends 0 to fix the length of the output List
                } else {
                    charArrayFinal.add(charArray.get(i));
                }

            }

Beispiel:

(278197)36= 5YNP

1
Davood Falahati

Dies kann für Sie hilfreich sein. Die Operation wird für die 4-stellige alphanumerische Zeichenfolge und die Dezimalzahl unter 1679615 ausgeführt. 

char[] alpaNum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
     String currentSeries = "";
    int num = 481261;
        String result = "";
        String baseConversionStr = "";
        boolean flag = true;
        do 
        {
            baseConversionStr = Integer.toString(num % 36) + baseConversionStr;
            String position = "";
            if(flag)
            {
                flag = false;
                position = baseConversionStr;
            }
            else
            {
                position = Integer.toString(num % 36);
            }
            result += alpaNum[new Integer(position)];    
            num = num/36;
   }
        while (num > 0);

        StringBuffer articleNo = new StringBuffer(result).reverse();

        String finalString = "";

        if(articleNo.length()==1)
        {
            finalString = "000"+articleNo;
        }
        else if(articleNo.length()==2)
        {
            finalString = "00"+articleNo;
        }
        else if(articleNo.length()==3)
        {
            finalString = "0"+articleNo;
        }

        currentSeries = finalString;
0
Omkar More

Ich habe diesen Code von this website in JavaScript erhalten, und dies ist meine Version in Java:

public static String customBase (int N, String base) {

    int radix = base.length();

    String returns = "";

    int Q = (int) Math.floor(Math.abs(N));
    int R = 0;

    while (Q != 0) {

        R = Q % radix;
        returns = base.charAt(R) + returns;
        Q /= radix; 

    }

    if(N == 0) {
        return String.valueOf(base.toCharArray()[0]);
    }

    return  N < 0 ? "-" + returns : returns;

}

Dies unterstützt negative Zahlen und benutzerdefinierte Basen.

Dezimal Addon:

public static String customBase (double N, String base) {

    String num = (String.valueOf(N));
    String[] split = num.split("\\.");
    if(split[0] == "" || split[1] == "") {
        return "";
    }
    return customBase(Integer.parseInt(split[0]), base)+ "." + customBase(Integer.parseInt(split[1]), base);

}
0

Hier ist eine Methode, um die Basis 10 in eine beliebige Basis zu konvertieren.

 public char[]  base10Converter(int number, int finalBase) {
    int quo;
    int rem;
    char[] res = new char[1];

    do {
        rem = number % finalBase;
        quo = number / finalBase;
        res = Arrays.copyOf(res, res.length + 1);
        if (rem < 10) {
            //Converting ints using ASCII values
            rem += 48;
            res[res.length - 1] = (char) rem;
        } else {
            //Convert int > 9 to A, B, C..
            rem += 55;
            res[res.length - 1] = (char) rem;
        }
        number /= finalBase;
    } while (quo != 0);


    //Reverse array
    char[] temp = new char[res.length];
    for (int i = res.length - 1, j = 0; i > 0; i--) {
        temp[j++] = res[i];
    }

    return temp;
 }
0
Nishant Jain

Vielleicht komme ich zu spät zur Party, aber dies ist die Lösung, mit der ich Calc/Excel-Zellennamen anhand ihres Index abrufen konnte:

public static void main(final String[] args) {
    final String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    System.out.println(toCustomBase(0, base));
    System.out.println(toCustomBase(2, base));
    System.out.println(toCustomBase(25, base));
    System.out.println(toCustomBase(26, base));
    System.out.println(toCustomBase(51, base));
    System.out.println(toCustomBase(52, base));
    System.out.println(toCustomBase(520, base));
}

public static String toCustomBase(final int num, final String base) {
    final int baseSize = base.length();
    if(num < baseSize) {
        return String.valueOf(base.charAt(num));
    }
    else {
        return toCustomBase(num / baseSize - 1, base) + base.charAt(num % baseSize);
    }
}

Ergebnisse:

A
C
Z
AA
AZ
BA
TA

Grundsätzlich akzeptiert die Lösung jede benutzerdefinierte Radix. Die Idee wurde von hier kommandiert.

0
akaine