如何将Long转换为base36?随着你的回答可以解释你是如何得出答案的?在scala中将long转换为base 36
我检查了scaladocs for Long转换为不同的基地,并将长转换为BigInt。我看到BigInt确实有toString(base)
,所以一个解决方案可能涉及改变类型,但我不知道如何。
注:我是新来的scala/java /类型安全的语言,所以我可以忽略一些微不足道的东西。
如何将Long转换为base36?随着你的回答可以解释你是如何得出答案的?在scala中将long转换为base 36
我检查了scaladocs for Long转换为不同的基地,并将长转换为BigInt。我看到BigInt确实有toString(base)
,所以一个解决方案可能涉及改变类型,但我不知道如何。
注:我是新来的scala/java /类型安全的语言,所以我可以忽略一些微不足道的东西。
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
那么,无论是在Scala的Long
或其增强类RichLong
上提供的方法,还是您必须在Java对应项上搜索它。后者恰好是这种情况。
它可以是来源类型或目标类型,并且因为long
不是Java中的类,所以您必须在java.lang.Long
上查找它。这不是在String
- 寻找方法为Long
- ,但你可以在java.lang.Long
找到它,只需要找到方法返回String
就可以了。
感谢您花时间帮助我确定自己解决问题的过程,非常感谢。 – AKnox 2013-02-19 05:21:47
住在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 Impatient.pdf”的第1章)。上面的答案工作,但似乎很奇怪。不得不跳入Java土地进行这样的基本转换似乎不太正确,特别是当所有东西都是BigInt
时。在回顾了scaladoc和上面的答案之后,其中一些失败了。
我最大的失败就是使用toInt()
,它很可怕地截断了myLong
。即将放弃,最后的尝试看起来如此简单直观,我几乎没有尝试:myBigInt = myLong
。也许有一天Long
会更丰富和理解toBigInt
......这是我在旅程中的第一次失败。
一般形式
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
所以,你要转换长到BigInt有。 BigInt对象有一个将Long作为参数的apply方法。这是REPL中的一个例子。
scala> BigInt(458982948578L).toString(36)
res11: String = 5uuqlhpe
你刚刚知道你必须去java的龙?我试图进入没有java经验的scala,我觉得我不知道在哪里可以找到答案有时候......这是我最后的结果:'def hasher(id:Long):String = { java.lang.Long.toString(id,36) }' 谢谢Josh! – AKnox 2013-02-19 04:41:50
@AKnox - 许多功能来自Java,而不是被复制;它也总是值得去检查那里的相关课程(如果有的话)。另外,对于散列函数来说,这似乎是一个非常糟糕的选择,但也许你的意思是非标准的“散列”。 – 2013-02-19 15:51:56
你知道是否有办法做相反的事情?从基地n读长? – 2016-03-23 17:49:48