Преобразовать длину до основания 36 в scala

Как мне преобразовать Long в base36? Наряду с вашим ответом можно объяснить, как вы пришли к ответу?

Я проверил scaladocs for Long для преобразования на другую базу и преобразования Long в BigInt. Я видел, что BigInt имеет toString( base ), поэтому решение может включать изменение типа, но я не мог понять, как это сделать.

Примечание. Я новичок в языках scala/java/type-safe, поэтому я мог бы игнорировать что-то тривиальное.

Ответы

Ответ 1

В классе java.lang.Long есть статический метод toString (long i, int radix), который преобразует Long в строковое представление другой базы. "Radix" означает то же самое, что и "base" в этом контексте.

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

Scala будет обрабатывать ваше значение scala Long как java.lang.Long при необходимости, поэтому при необходимости вы всегда можете искать методы в документации по API Java. См.: http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html

Ответ 2

Оставаясь на языке Scala, преобразование Long в BigInt оказывается простым:

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

:

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

Они, как я пришел к теме, были разработчиками Java и Scala beginner (чтение главы 1 "Scala для Impatient.pdf" ). Ответы выше работали, но казались странными. Необходимость прыгать на Землю Java для такого базового преобразования казалась менее правильной, особенно когда BigInt имел все вещи. После обзора scaladoc и ответов выше, несколько неудачных последовало.

Моя самая большая неудача заключалась в использовании toInt(), который ужасно урезал myLong. О сдаче, последняя попытка казалась такой простой и интуитивной, что я почти не пробовал: myBigInt = myLong. Возможно, однажды Long будет богаче и поймет toBigInt... это был мой первый провал в путешествии.

Ответ 3

Итак, вы хотите преобразовать Long в BigInt. Объект BigInt имеет метод apply, который принимает Long как параметр. Вот пример в REPL.

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

Ответ 4

Ну, либо метод доступен в Scala Long, либо в его классе повышения, RichLong, или вы должны искать его в Java-партнере. Последнее происходит именно так.

Это может быть либо тип источника, либо тип назначения, а так как Long не является классом в Java, вам придется искать его на java.lang.Long. Это не на String - искать методы, принимающие Long -, но вы можете найти его на java.lang.Long, просто ищет методы, возвращающие String на нем.

Ответ 5

Общая форма

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

(И наоборот)

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