Si j'ai un nombre décimal, comment puis-je le convertir en base 36 en Java?
Étant donné un nombre i
, utilisez Integer.toString(i, 36)
.
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
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);
}
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.
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;
}
}
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
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;
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);
}
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;
}
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 .