scala long-integer base36

Convertir un largo a base 36 en scala



long-integer base36 (5)

Así que quieres convertir Long a BigInt. El objeto BigInt tiene un método de aplicación que toma Long como parámetro. Aquí hay un ejemplo en el REPL.

scala> BigInt(458982948578L).toString(36) res11: String = 5uuqlhpe

¿Cómo puedo convertir un largo a base36? ¿Junto con tu respuesta puedes explicar cómo llegaste a la respuesta?

He revisado los scaladocs para que Long se convierta en una base diferente, y al convertir un Long en un BigInt. Vi que BigInt tiene toString( base ) por lo que una solución podría implicar cambiar el tipo, pero no pude averiguar cómo.

Nota: soy nuevo en los lenguajes scala / java / type-safe, por lo que podría pasar por alto algo trivial.


Bueno, el método está disponible en Scala''s Long o su clase de mejora, RichLong , o debe buscarlo en la contraparte de Java. Este último es el caso.

Puede ser en el tipo de origen o en el tipo de destino, y como no es una clase en Java, tendrías que buscarlo en java.lang.Long . No está en String - busque métodos que tomen Long -, pero puede encontrarlo en java.lang.Long , solo está buscando métodos que devuelvan String .


Forma general

def nextInt(d: Double): Int = if (math.floor(d) == d) d.toInt + 1 else math.ceil(d).toInt def digitsL(base: Int, n: Long, padTo: Int = 0): List[Int] = List.fill(List(padTo, nextInt(math.log(n) / math.log(base))).max - 1)() .foldLeft((List((n % base).toInt), base)) { case ((cum, div), _) => (((n / div) % base).toInt +: cum, div * base) }._1

(Y al revés)

def digitsToLong(base: Int, digits: List[Int]): Long = digits.foldRight((0L, 1)){ case (cur, (cum, pow)) => (cum + cur.toLong * pow, pow * base) }._1


La clase java.lang.Long tiene un método estático toString (long i, int radix) que convertirá un Long en una representación de cadena de otra base. "Radix" significa lo mismo que "base" en este contexto.

val myLong = 25000L val longInBase36:String = java.lang.Long.toString(myLong, 36)

Scala tratará su valor Scala Long como java.lang.Long cuando sea necesario, por lo que siempre puede buscar métodos en la documentación de la API de Java cuando sea necesario. Consulte: http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html


Permanecer dentro del lenguaje Scala, convertir Long en un BigInt resulta ser simple:

var myLong : Long = Long.MaxValue var myBigInt : BigInt = myLong myBigInt.toString(36)

siendo la salida:

myLong: Long = 9223372036854775807 myBigInt: scala.math.BigInt = 9223372036854775807 res199: String = 1y2p0ij32e8e7

La forma en que llegué al tema fue como desarrollador de Java y principiante en Scala (leyendo el capítulo 1 de "Scala for the Impatient.pdf"). Las respuestas anteriores funcionaron pero parecían extrañas. Tener que saltar a Java para una conversión tan básica parecía menos correcto de alguna manera, especialmente cuando BigInt tenía todas las cosas. Después de revisar scaladoc y las respuestas anteriores, siguieron algunas fallas.

Mi mayor falla fue usar toInt() que trunca myLong horriblemente. A punto de rendirme, el intento final me pareció tan simple e intuitivo que casi no lo intenté: myBigInt = myLong . Quizás algún día sea más rico y comprenda a toBigInt ... Esta fue mi primera falla en el viaje.