redondear - En Java, ¿cómo se convierte un número decimal a base 36?
math.round java dos decimales (9)
Si tengo un número decimal, ¿cómo lo convierto a base 36 en Java?
Aquí hay un método para convertir la base 10 a cualquier base dada.
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;
}
Consulte la documentación para 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é es radix
? Estás de suerte para la Base 36 (y tiene sentido)
http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#MAX_RADIX
public static final int MAX_RADIX 36
Este código funciona:
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;
}
}
Esto puede ser útil para usted. La operación se realiza con la cadena alfanumérica de 4 dígitos y el número decimal debajo de 1679615. Puede modificar el código en consecuencia.
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;
Lo siguiente puede funcionar para cualquier base, no solo para 36. Simplemente reemplace los contenidos de la cadena del code
.
Codificar:
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();
}
Descodificar:
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);
}
Obtuve este código de this sitio web en JavaScript, y esta es mi versión 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;
}
Esto admite números negativos y bases personalizadas.
Complemento decimal:
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);
}
Primero tiene que convertir su número en el formato de número interno de Java (que sucede que está basado en 2, pero esto realmente no importa aquí), por ejemplo, por Integer.parseInt()
(si su número es un número entero menor que 2 ^ 31). Luego puede convertirlo de int
al formato de salida deseado. El método Integer.toString(i, 36)
hace usando 0123456789abcdefghijklmnopqrstuvwxyz
como dígitos (los dígitos decimales 0-9 y letras minúsculas en inglés en orden alfabético). Si quiere algunos otros dígitos, puede convertir el resultado reemplazando los "dígitos" (por ejemplo, toUpperCase
), o puede hacer la conversión usted mismo; no es magia, simplemente un bucle de tomar el módulo restante 36 y dividir por 36 ( con una búsqueda del dígito correcto).
Si su número es más largo que las ofertas int que desea usar long
(con Long
) o BigInteger
lugar, tienen conversores de radix similares.
Si su número tiene "dígitos después del punto", es un poco más difícil, ya que la mayoría (finitos) de base-X-números no son exactamente representables como (finitos) base-Y-números si (una potencia de) Y no es un múltiplo de X.
Si no quiere usar Integer.toString (Num, base), por ejemplo, en mi caso, que necesitaba una variable de 64 bits de longitud, puede usar el siguiente código: Usar Lists en JAVA facilita esta conversión
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));
}
}
Ejemplo:
(278197) 36 = 5YNP
Dado un número i
, use Integer.toString(i, 36)
.