2013-02-19 76 views
15

如何将Long转换为base36?随着你的回答可以解释你是如何得出答案的?在scala中将long转换为base 36

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

注:我是新来的scala/java /类型安全的语言,所以我可以忽略一些微不足道的东西。

回答

23

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

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

斯卡拉将把您的长阶值作为必要时一个java.lang.Long中,让您可以随时查找Java API文档的方法在必要的时候。请参阅:http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html

+1

你刚刚知道你必须去java的龙?我试图进入没有java经验的scala,我觉得我不知道在哪里可以找到答案有时候......这是我最后的结果:'def hasher(id:Long):String = { java.lang.Long.toString(id,36) }' 谢谢Josh! – AKnox 2013-02-19 04:41:50

+1

@AKnox - 许多功能来自Java,而不是被复制;它也总是值得去检查那里的相关课程(如果有的话)。另外,对于散列函数来说,这似乎是一个非常糟糕的选择,但也许你的意思是非标准的“散列”。 – 2013-02-19 15:51:56

+0

你知道是否有办法做相反的事情?从基地n读长? – 2016-03-23 17:49:48

5

那么,无论是在Scala的Long或其增强类RichLong上提供的方法,还是您必须在Java对应项上搜索它。后者恰好是这种情况。

它可以是来源类型或目标类型,并且因为long不是Java中的类,所以您必须在java.lang.Long上查找它。这不是在String - 寻找方法为Long - ,但你可以在java.lang.Long找到它,只需要找到方法返回String就可以了。

+0

感谢您花时间帮助我确定自己解决问题的过程,非常感谢。 – AKnox 2013-02-19 05:21:47

38

住在Scala语言中,转换LongBigInt原来很简单:

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 Impatient.pdf”的第1章)。上面的答案工作,但似乎很奇怪。不得不跳入Java土地进行这样的基本转换似乎不太正确,特别是当所有东西都是BigInt时。在回顾了scaladoc和上面的答案之后,其中一些失败了。

我最大的失败就是使用toInt(),它很可怕地截断了myLong。即将放弃,最后的尝试看起来如此简单直观,我几乎没有尝试:myBigInt = myLong。也许有一天Long会更丰富和理解toBigInt ......这是我在旅程中的第一次失败。

+1

这是一个更好的答案。 Thnx – Ward 2013-10-03 05:56:21

+1

它会更好,如果它使用val而不是var – 2015-11-08 16:22:49

+0

该死!没想到有一个'toString'变体可以将基数作为参数。谢谢! – asgs 2016-11-06 18:33:38

-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 
8

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

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