2013-02-19 60 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 
相關問題