En Java, ¿cómo se convierte un número decimal a base 36?

Si tengo un número decimal, ¿cómo lo convierto a base 36 en Java?

Dado un número i , use Integer.toString(i, 36) .

Consulte la documentación para 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é es radix ? Estás de suerte para la Base 36 (y tiene sentido)
http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#MAX_RADIX

 public static final int MAX_RADIX 36 

Lo siguiente puede funcionar para cualquier base, no solo para 36. Simplemente reemplace los contenidos de la cadena del code .

Codificar:

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

Descodificar:

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

Primero tiene que convertir su número en el formato de número interno de Java (que sucede que está basado en 2, pero esto realmente no importa aquí), por ejemplo, por Integer.parseInt() (si su número es un número entero menor que 2 ^ 31). Luego puede convertirlo de int al formato de salida deseado. El método Integer.toString(i, 36) hace usando 0123456789abcdefghijklmnopqrstuvwxyz como dígitos (los dígitos decimales 0-9 y letras minúsculas en inglés en orden alfabético). Si quiere algunos otros dígitos, puede convertir el resultado reemplazando los “dígitos” (por ejemplo, toUpperCase ), o puede hacer la conversión usted mismo; no es magia, simplemente un bucle de tomar el módulo restante 36 y dividir por 36 ( con una búsqueda del dígito correcto).

Si su número es más largo que las ofertas int que desea usar long (con Long ) o BigInteger lugar, tienen conversores de radix similares.

Si su número tiene “dígitos después del punto”, es un poco más difícil, ya que la mayoría (finitos) de base-X-números no son exactamente representables como (finitos) base-Y-números si (una potencia de) Y no es un múltiplo de X.

Este código funciona:

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

Si no quiere usar Integer.toString (Num, base), por ejemplo, en mi caso, que necesitaba una variable de 64 bits de longitud, puede usar el siguiente código: Usar Lists en JAVA facilita esta conversión

 long toBeConverted=10000; // example, Initialized by 10000 List charArray = new ArrayList(); List charArrayFinal = new ArrayList(); 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)); } } 

Ejemplo:

(278197) 36 = 5YNP

Aquí hay un método para convertir la base 10 a cualquier base dada.

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

Esto puede ser útil para usted. La operación se realiza con la cadena alfanumérica de 4 dígitos y el número decimal debajo de 1679615. Puede modificar el código en consecuencia.

 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; 

Obtuve este código de este sitio web en JavaScript, y esta es mi versión 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; } 

Esto admite números negativos y bases personalizadas.

Complemento decimal:

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