In Java how do you convert a decimal number to base 36?

JavaMathDecimal

Java Problem Overview


If I have a decimal number, how do I convert it to base 36 in Java?

Java Solutions


Solution 1 - Java

Given a number i, use Integer.toString(i, 36).

Solution 2 - Java

See the documentation for 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
 

What is radix? You're in luck for Base 36 (and it makes sense)
http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#MAX_RADIX

public static final int 	MAX_RADIX 	36

Solution 3 - Java

The following can work for any base, not just 36. Simply replace the String contents of code.

Encode:

int num = 586403532;
String code = "0123456789abcdefghijklmnopqrstuvwxyz";
String text = "";
int 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();
}

Decode:

String text = "0vn4p9";
String code = "0123456789abcdefghijklmnopqrstuvwxyz";
int num = 0;
int 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);
}

Solution 4 - Java

First you have to convert your number it into the internal number format of Java (which happens to be 2-based, but this does not really matter here), for example by Integer.parseInt() (if your number is an integer less than 2^31). Then you can convert it from int to the desired output format. The method Integer.toString(i, 36) does this by using 0123456789abcdefghijklmnopqrstuvwxyz as digits (the decimal digits 0-9 and lower case english letters in alphabetic order). If you want some other digits, you can either convert the result by replacing the "digits" (for example toUpperCase), or do the conversion yourself - it is no magic, simply a loop of taking the remainder modulo 36 and dividing by 36 (with a lookup of the right digit).

If your number is longer than what int offers you may want to use long (with Long) or BigInteger instead, they have similar radix-converters.

If your number has "digits after the point", it is a bit more difficult, as most (finite) base-X-numbers are not exactly representable as (finite) base-Y-numbers if (a power of) Y is not a multiple of X.

Solution 5 - Java

This code works:

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

Solution 6 - Java

If you dont want to use Integer.toString(Num , base) , for instance, in my case which I needed a 64 bit long variable, you can use the following code: Using Lists in JAVA facilitates this 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));
                }
            
            }

Example:

(278197)36=5YNP

Solution 7 - Java

Maybe I'm late to the party, but this is the solution I was using for getting Calc/Excel cell names by their 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);
    }
}

Results:

A
C
Z
AA
AZ
BA
TA

Basically the solution accepts any custom radix. The idea was commandeered from here.

Solution 8 - Java

Not sure if the above answers did help but noting 'decimal' and 'to base36' I assume you want to convert a numeric value to base36. And as long as the Long value of the raw figure is within (0 - Long.MAX_VALUE):

String someNumericString = "9223372036854";
Long l = Long.valueOf(someNumericString);
String bases36 = Long.toString(l, 36);

System.out.println("base36 value: "+bases36);

output: 39p5pkj5i

Solution 9 - Java

Here is a method to convert base 10 to any given base.

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

Solution 10 - Java

This can be helpful to you.The operation being performed on the 4 digit alphanumeric String and decimal number below 1679615. You can Modify code accordingly.

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 number = new StringBuffer(result).reverse();
		
		String finalString = "";
		
		if(number.length()==1)
		{
			finalString = "000"+articleNo;
		}
		else if(number.length()==2)
		{
			finalString = "00"+articleNo;
		}
		else if(number.length()==3)
		{
			finalString = "0"+articleNo;
		}
		
		currentSeries = finalString;

Solution 11 - Java

I got this code from this website in JavaScript, and this is my 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;

}

This supports negative numbers and custom bases.

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

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionslavojView Question on Stackoverflow
Solution 1 - JavaJeremiah WillcockView Answer on Stackoverflow
Solution 2 - JavaRichardTheKiwiView Answer on Stackoverflow
Solution 3 - Javahcps-tenembasjView Answer on Stackoverflow
Solution 4 - JavaPaŭlo EbermannView Answer on Stackoverflow
Solution 5 - JavafrankView Answer on Stackoverflow
Solution 6 - JavaDavood FalahatiView Answer on Stackoverflow
Solution 7 - JavaakaineView Answer on Stackoverflow
Solution 8 - JavaXstarzView Answer on Stackoverflow
Solution 9 - JavaNishant JainView Answer on Stackoverflow
Solution 10 - JavaOmkar MoreView Answer on Stackoverflow
Solution 11 - JavanathanfrankeView Answer on Stackoverflow