В Java, как вы конвертируете десятичное число в базу 36? - PullRequest
41 голосов
/ 21 февраля 2011

Если у меня есть десятичное число, как мне преобразовать его в базу 36 в Java?

Ответы [ 10 ]

74 голосов
/ 21 февраля 2011

Учитывая число i, используйте Integer.toString(i, 36).

16 голосов
/ 21 февраля 2011

См. Документацию для 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? Вам повезло с Base 36 (и это имеет смысл)
http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#MAX_RADIX

public static final int     MAX_RADIX   36
14 голосов
/ 03 октября 2014

Следующее может работать для любой базы, а не только для 36. Просто замените содержимое строки code.

Encode:

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

Decode:

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);
}
9 голосов
/ 21 февраля 2011

Сначала вы должны преобразовать свой номер в формат внутреннего числа Java (который на самом деле основывается на 2, но здесь это не имеет значения), например на Integer.parseInt() (если ваш номер меньше целого числа чем 2 ^ 31). Затем вы можете преобразовать его из int в желаемый формат вывода. Метод Integer.toString(i, 36) делает это, используя 0123456789abcdefghijklmnopqrstuvwxyz в качестве цифр (десятичные цифры 0-9 и строчные английские буквы в алфавитном порядке). Если вам нужны другие цифры, вы можете либо преобразовать результат, заменив «цифры» (например, toUpperCase), либо выполнить преобразование самостоятельно - это не волшебство, это просто цикл взятия остатка по модулю 36 и деления на 36 (с поиском правой цифры).

Если ваш номер длиннее, чем тот, который предлагает int, вы можете использовать longLong) или BigInteger вместо них, у них есть аналогичные радиокс-конвертеры.

Если ваше число имеет «цифры после точки», это немного сложнее, так как большинство (конечных) чисел base-X не точно представлены в виде (конечных) чисел base-Y, если (степень) Y не кратен X.

1 голос
/ 14 декабря 2015

Если вы не хотите использовать, например, Integer.toString (Num, base), в моем случае, когда мне понадобилась переменная длиной 64 бита, вы можете использовать следующий код: Использование списков в 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

1 голос
/ 19 февраля 2015

Этот код работает:

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


}
0 голосов
/ 20 сентября 2018

Возможно, я опоздал на вечеринку, но это решение, которое я использовал для получения имен ячеек Calc / Excel по их индексу:

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

Результаты:

A
C
Z
AA
AZ
BA
TA

В основном, решение принимает любой пользовательский радиус. Идея была взята из здесь .

0 голосов
/ 19 июля 2017

Я получил этот код с этого сайта на 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);

}
0 голосов
/ 27 декабря 2016

Это может быть полезно для вас. Операция выполняется для 4-значной буквенно-цифровой строки и десятичного числа ниже 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;
0 голосов
/ 09 ноября 2015

Вот метод преобразования базы 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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...