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.