You are on page 1of 2

package numberconveter;

/**
*
* @author Andrei
*/
import java.util.Scanner;
public class NumberBaseConv {
public static void main(String[] args) {
// inits
Scanner sc = new Scanner(System.in);
String origNum;
String newNum;
int origBase;
int newBase;
System.out.print("Introduceti numarul pe care doriti sa-l convertiti: ")
;
origNum = sc.nextLine();
System.out.print("Introduceti baza numarului pe care doriti sa-l convert
iti: ");
origBase = sc.nextInt();
ValidateBase(origBase);
ValidateNumInBase(origNum, origBase);
System.out.print("Introduceti noua baza in care doriti sa convertiti num
arul: ");
newBase = sc.nextInt();
sc.close();
newNum = NumConvertBase(origNum, origBase, newBase);
System.out.println("Noul numar este: " + newNum);
}
private static void ValidateBase(int base) {
if (base < 2 || base > 36) {
System.out.println("Eroare: Baza trebuie sa fie >= 2 si <= 36");
System.exit(1);
}
}
private static void ValidateNumInBase(String num, int base) {
// check that digits of number range from 0-(base-1)
char chDigit;
for (int d = 0; d < num.length(); d++) {
chDigit = num.toUpperCase().charAt(d);
if (Character.isDigit(chDigit)
&& (chDigit - '0') >= base) {
System.out.println("Nu exista numarul " + chDigit
+ " in baza " + base);
System.exit(1);
} else if (Character.isLetter(chDigit)

&& (chDigit - 'A') + 10 >= base) {


System.out.println("Nu exista numarul " + chDigit
+ " in baza " + base);
System.exit(1);
} else if (!Character.isDigit(chDigit)
&& !Character.isLetter(chDigit)) {
System.out.println("Numar invalid " + chDigit);
}
}
}
private static String NumConvertBase(String origNum, int origBase,
int newBase) {
double val = 0;
double decDigit = 0;
char chDigit;
int L = origNum.length();
for (int p = 0; p < L; p++) {
chDigit = Character.toUpperCase(origNum.charAt(L - 1 - p));
if (Character.isLetter(chDigit)) {
decDigit = 10 + chDigit - 'A';
} else if (Character.isDigit(chDigit)) {
decDigit = chDigit - '0';
} else {
System.out.println("Eroare: numar nerecunoscut " + chDigit);
System.exit(1);
}
val += decDigit * Math.pow(origBase, p);
}
int D = 1;
for (; Math.pow(newBase, D) <= val; D++) {
}
char[] newNum = new char[D];
double pwr;
for (int p = D - 1; p >= 0; p--) {
pwr = Math.pow(newBase, p);
decDigit = Math.floor(val / pwr);
val -= decDigit * pwr;
if (decDigit <= 9) {
newNum[D - 1 - p] = (char) ('0' + (int) decDigit);
} else {
newNum[D - 1 - p] = (char) ('A' + (int) (decDigit - 10));
}
}
return new String(newNum);
}
}

You might also like