在Java中,你如何将十进制数转换为基数36?

如果我有一个十进制数,我如何将它转换为Java中的基数36?

给定一个数字i ,使用Integer.toString(i, 36)

请参阅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 

什么是radix ? 你很幸运,基地36(这是有道理的)
http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#MAX_RADIX

 public static final int MAX_RADIX 36 

以下可以适用于任何基础,而不仅仅是简单地replacestring内容的code

编码:

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

解码:

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

首先你必须把你的数字转换成Java的内部数字格式(这恰好是基于2的,但在这里并不重要),例如通过Integer.parseInt() (如果你的数字是一个小于2 ^ 31)。 然后你可以将它从int转换为所需的输出格式。 Integer.toString(i, 36)方法通过使用0123456789abcdefghijklmnopqrstuvwxyz作为数字(十进制数字0-9和小写英文字母按字母顺序)来完成此操作。 如果你想要一些其他的数字,你可以通过replace“数字”(例如toUpperCase )来转换结果,或者自己进行转换 – 这不是魔术,只是一个以36为余数并除以36(查找正确的数字)。

如果你的数字比int提供的要long你可能想使用longLong )或者BigInteger来代替它们,它们有相似的基数转换器。

如果你的数字有“数字之后的数字”,那么它就更难一些了,因为如果Y的幂数不是(有限的)基数X不能精确地表示为X的倍数。

此代码工作:

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

如果你不想使用Integer.toString(Num,base),例如,在我的情况下,我需要一个64位长的variables,你可以使用下面的代码:在JAVA中使用列表有助于这种转换

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

例:

(278197) 36 = 5YNP

这是一个方法来转换基地10任何给定的基地。

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

这对您有帮助。正在对4位字母数字string和1679615以下的十进制数进行操作。您可以相应地修改代码。

 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; 

我从JavaScript获得了这个代码,这是我在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; } 

这支持负数和自定义的基础。

十进制插件:

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