如何將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