web-dev-qa-db-fra.com

En Java, comment convertir un nombre décimal en base 36?

Si j'ai un nombre décimal, comment puis-je le convertir en base 36 en Java?

41
slavoj

Étant donné un nombre i, utilisez Integer.toString(i, 36).

73
Jeremiah Willcock

Voir la documentation pour 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

Qu'est-ce que radix? Vous avez de la chance pour la base 36 (et c'est logique)
http://docs.Oracle.com/javase/7/docs/api/Java/lang/Character.html#MAX_RADIX

public static final int     MAX_RADIX   36
16
RichardTheKiwi

Les éléments suivants peuvent fonctionner pour n'importe quelle base, pas seulement 36. Remplacez simplement le contenu de chaîne de code.

Encoder:

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();
}

Décoder:

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

Vous devez d’abord convertir votre numéro dans le format de numéro interne de Java (qui se trouve être basé sur 2, mais cela n’a pas vraiment d’importance ici), par exemple avec Integer.parseInt() (si votre numéro est un entier inférieur à 2 ^ 31). . Ensuite, vous pouvez le convertir de int au format de sortie souhaité. Pour ce faire, la méthode Integer.toString(i, 36) utilise les chiffres 0123456789abcdefghijklmnopqrstuvwxyz (les chiffres décimaux 0-9 et les lettres anglaises minuscules par ordre alphabétique). Si vous voulez d’autres chiffres, vous pouvez convertir le résultat en remplaçant les "chiffres" (par exemple, toUpperCase), ou effectuer la conversion vous-même. avec une recherche du bon chiffre).

Si votre nombre est plus long que ce que propose int, vous pouvez utiliser plutôt long (avec Long) ou BigInteger, ils ont des convertisseurs de base similaires.

Si votre nombre comporte "chiffres après le point", cela devient un peu plus difficile, car la plupart des nombres-X de base (finis) ne sont pas exactement représentables en tant que nombres-Y de base (finis) si (une puissance de) Y n'est pas un multiple de X.

9
Paŭlo Ebermann

Ce code fonctionne:

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

Si vous ne souhaitez pas utiliser Integer.toString (Num, base), par exemple, dans mon cas pour lequel j'avais besoin d'une variable longue de 64 bits, vous pouvez utiliser le code suivant: L'utilisation de listes en Java facilite cette conversion

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));
                }

            }

Exemple:

(278197)36= 5YNP

1
Davood Falahati

Cela peut vous être utile. L'opération en cours sur la chaîne alphanumérique à 4 chiffres et le nombre décimal inférieur à 1679615. Vous pouvez modifier le code en conséquence. 

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

J'ai obtenu ce code de this site web en JavaScript, et voici ma version en 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;

}

Cela prend en charge les nombres négatifs et les bases personnalisées.

Addon décimal:

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
nathanthesnooper

Voici une méthode pour convertir la base 10 en une base donnée.

 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

Je suis peut-être en retard à la fête, mais voici la solution que j'utilisais pour obtenir les noms de cellules Calc/Excel par leur index:

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);
    }
}

Résultats:

A
C
Z
AA
AZ
BA
TA

Fondamentalement, la solution accepte toute base personnalisée. L'idée a été commandée à partir de ici .

0
akaine