20

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

我已经检查了Long 的 scaladocs 以转换为不同的基础,并将 Long 转换为 BigInt。我看到BigInt确实有toString( base )一个解决方案可能涉及更改类型,但我不知道如何。

注意:我是 scala / java / 类型安全语言的新手,所以我可能会忽略一些琐碎的事情。

4

5 回答 5

42

在 Scala 语言中,转换Long为 aBigInt变得很简单:

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……这是我旅途中的第一次失败。

于 2013-03-24T19:23:48.727 回答
28

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

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

于 2013-02-19T04:27:03.410 回答
8

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

scala> BigInt(458982948578L).toString(36)
res11: String = 5uuqlhpe
于 2015-04-19T07:58:10.450 回答
5

好吧,要么该方法在 ScalaLong或其增强类中可用RichLong,要么您必须在 Java 对应物上搜索它。后者恰好是这种情况。

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

于 2013-02-19T04:43:23.103 回答
-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
于 2014-03-06T12:43:51.610 回答