Wie kann ich eine Dezimalzahl in Java in Basis 36 konvertieren?
Verwenden Sie bei einer gegebenen Zahl i
Integer.toString(i, 36)
.
Weitere Informationen finden Sie in der Dokumentation zu 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
Was ist radix
? Sie haben Glück für Base 36 (und es macht Sinn)
http://docs.Oracle.com/javase/7/docs/api/Java/lang/Character.html#MAX_RADIX
public static final int MAX_RADIX 36
Folgendes kann für jede Basis funktionieren, nicht nur für 36. Ersetzen Sie einfach den String-Inhalt von code
.
Kodieren:
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();
}
Dekodieren:
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);
}
Zuerst müssen Sie Ihre Nummer in das interne Zahlenformat von Java konvertieren (was zufällig 2-basiert ist, aber das spielt hier keine Rolle), zum Beispiel durch Integer.parseInt()
(wenn Ihre Nummer eine Ganzzahl kleiner als 2 ^ 31 ist). . Dann können Sie es von int
in das gewünschte Ausgabeformat konvertieren. Die Methode Integer.toString(i, 36)
verwendet dazu 0123456789abcdefghijklmnopqrstuvwxyz
als Ziffern (Dezimalstellen 0-9 und englische Kleinbuchstaben in alphabetischer Reihenfolge). Wenn Sie andere Ziffern wünschen, können Sie entweder das Ergebnis konvertieren, indem Sie die "Ziffern" ersetzen (zum Beispiel toUpperCase
), oder die Konvertierung selbst vornehmen. mit einem Nachschlag der rechten Ziffer).
Wenn Ihre Nummer länger ist als das, was int anbietet, können Sie stattdessen long
(mit Long
) oder BigInteger
verwenden. Sie haben ähnliche Radix-Konverter.
Wenn Ihre Zahl "Ziffern hinter dem Punkt" hat, ist es etwas schwieriger, da die meisten (endlichen) Basis-X-Zahlen nicht exakt als (endliche) Basis-Y-Zahlen darstellbar sind, wenn (eine Potenz von) Y nicht ist ein Vielfaches von X.
Dieser Code funktioniert:
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;
}
}
Wenn Sie nicht Integer.toString (Num, base) verwenden möchten, in meinem Fall, für den ich eine 64-Bit-Variable benötigte, können Sie folgenden Code verwenden: Die Verwendung von Listen in Java erleichtert diese Konvertierung
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));
}
}
Beispiel:
(278197)36= 5YNP
Dies kann für Sie hilfreich sein. Die Operation wird für die 4-stellige alphanumerische Zeichenfolge und die Dezimalzahl unter 1679615 ausgeführt.
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;
Ich habe diesen Code von this website in JavaScript erhalten, und dies ist meine 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;
}
Dies unterstützt negative Zahlen und benutzerdefinierte Basen.
Dezimal 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);
}
Hier ist eine Methode, um die Basis 10 in eine beliebige Basis zu konvertieren.
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;
}
Vielleicht komme ich zu spät zur Party, aber dies ist die Lösung, mit der ich Calc/Excel-Zellennamen anhand ihres Index abrufen konnte:
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);
}
}
Ergebnisse:
A
C
Z
AA
AZ
BA
TA
Grundsätzlich akzeptiert die Lösung jede benutzerdefinierte Radix. Die Idee wurde von hier kommandiert.