2012-02-25 69 views
28

Scala是否內置二進制數據格式化程序?格式化Scala中的二進制值

例如,要打印出:00000011爲int值3

寫一個不會很困難 - 如果它存在只是好奇。

回答

56
scala> 3.toBinaryString 
res0: String = 11 

Scala有從int的隱式轉換到RichInt其中有一個方法toBinaryString。儘管這個函數不打印前導零。

20

我不知道一個直接的API的方法來做到這一點,但這裏是這樣做的一種方式:

def toBinary(i: Int, digits: Int = 8) = 
    String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0') 
+1

+1添加零;-) – Jack 2012-02-25 08:30:05

+0

@JacobusR謝謝。其實我相信這就是你問的問題,因爲你的問題非常清楚,要求「內置格式化程序*」,而不是轉換器! – 2012-02-25 12:35:26

2

這裏是另一種方式(傳統Java):

val x = 5 
val str = Integer.toString(x,2) 

就像勞裏的答案,它不打印前導零。

+0

我一直忘記在Scala中使用Java沒有任何壞處 – Jack 2012-02-25 08:31:37

0

你可以做這樣的事情:

scala> val x = 3 
x: Int = 3 

scala> Integer.toString(x, 2) 
res4: java.lang.String = 11 

至於其他的建議,這並不具有前導零...

9

8位數號碼3前導零:

printf ("%08d", 3.toBinaryString.toInt) 
00000011 

由於Hosam Aly建議創建一個字符串,因此以下是一種方法:

def asNdigitBinary (source: Int, digits: Int): String = { 
    val l: java.lang.Long = source.toBinaryString.toLong 
    String.format ("%0" + digits + "d", l) } 

在一般情況下,使用長是比較合適的,因爲二進制值長期做下去非常快:

scala> asNdigitBinary (1024*512-1, 32) 
res23: String = 00000000000001111111111111111111 

所以記住這一點 - 一個自制的,遞歸的做法,通過數字生成數字和填充它們最後很容易處理BigInt的任意值。

def toBinDigits (bi: BigInt): String = { 
    if (bi == 0) "0" else toBinDigits (bi /2) + (bi % 2)} 

def fillBinary (bi: BigInt, len: Int) = { 
    val s = toBinDigits (bi) 
    if (s.length >= len) s 
    else (List.fill (len-s.length) ("0")).mkString ("") + s 
} 

這將是很好,如果

def asNdigitBinary (source: Int, digits: Int): String = { 
    val l = BigInt (source.toBinaryString.toLong) 
    String.format ("%0" + digits + "d", l)} 

會的工作,但 「%0ND」 不匹配BigInt有數字。也許應該發佈Bugreport/Feature請求?但是對於Scala或Java?

+0

這是一個很好的答案,只是它打印結果而不是將其存儲在可用變量中。你可以試試這個: 'String.format(「%08d」,3.toBinaryString.toInt.asInstanceOf [Object])' – 2012-02-27 13:36:02

+0

@HosamAly:'例如輸出:00000011爲Int值3.' – 2012-02-28 02:01:14

+0

好抓住。 :)儘管如此,將通用版本添加到您的答案將會很有價值。我會將它添加到我的,但我相信這是你的想法。 – 2012-02-28 14:26:43

1

這將打印前導零:

def int2bin(i: Int, numPos: Int): String = { 
    def nextPow2(i: Int, acc: Int): Int = if (i < acc) acc else nextPow2(i, 2 * acc) 
    (nextPow2(i, math.pow(2,numPos).toInt)+i).toBinaryString.substring(1) 
    } 
0

我通常使用預先設置想要的長度-1的零,然後就砍了最右邊的字符:

"0000000" + 3.toBinaryString takeRight 8 

也能正常工作負值也是如此。

相關問題