在scala中将Long转换为base 36

时间:2013-02-19 04:13:08

标签: scala long-integer base36

如何将Long转换为base36?你的答案可以解释你是如何得出答案的吗?

我已经检查了scaladocs for Long转换到不同的基础,以及将Long转换为BigInt。我看到BigInt确实有toString( base )所以解决方案可能涉及更改类型,但我无法弄清楚如何。

注意:我是scala / java / type-safe语言的新手,所以我可能会忽略一些微不足道的事情。

5 个答案:

答案 0 :(得分:41)

保持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初学者(阅读“Scala for the Impatient.pdf”的第1章)。上面的答案有效但似乎很奇怪。不得不以某种方式进入Java土地进行这样的基本转换似乎不太正确,特别是当BigInt拥有所有内容时。在审查了scaladoc和上面的答案之后,一些失败了。

我最大的失败是使用toInt(),可能会严重截断myLong。即将放弃,最后的尝试似乎如此简单和直观,以至于我几乎没有尝试过:myBigInt = myLong。也许有一天Long会更富有并理解toBigInt ......这是我在旅途中的第一次失败。

答案 1 :(得分:24)

类java.lang.Long有一个静态方法toString(long i,int radix),它将Long转换为另一个base的字符串表示形式。 “Radix”在这种情况下与“基础”的含义相同。

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

Scala会在必要时将scala Long值视为java.lang.Long,因此您可以在必要时始终在Java API文档中查找方法。请参阅:http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html

答案 2 :(得分:8)

所以你想把Long转换为BigInt。 BigInt对象有一个apply方法,它将Long作为参数。这是REPL中的一个例子。

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

答案 3 :(得分:5)

嗯,这个方法可以在Scala的Long或其增强类RichLong上使用,或者您必须在Java对应项上搜索它。事实恰恰相反。

它可以是源类型或目标类型,由于long不是Java中的类,因此您必须在java.lang.Long上查找它。它不在String上 - 查找采用Long - 的方法,但您可以在java.lang.Long上找到它,只需查找返回String的方法。

答案 4 :(得分:-1)

一般表格

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