Does Scala have a built in formatter for binary data?
For example to print out: 00000011 for the Int value 3.
Writing one won\'t be difficult - just curious
8 digits for number 3 with leading zeros:
printf ("%08d", 3.toBinaryString.toInt)
00000011
Since Hosam Aly suggests to create a String as well, here is a method to do so:
def asNdigitBinary (source: Int, digits: Int): String = {
val l: java.lang.Long = source.toBinaryString.toLong
String.format ("%0" + digits + "d", l) }
In the general case, using a Long is more appropriate, since binary values get long very fast:
scala> asNdigitBinary (1024*512-1, 32)
res23: String = 00000000000001111111111111111111
So keep that in mind - a selfmade, recursive approach which generates digit by digit and fills them up in the end would be easily made to handle arbitrary values of 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
}
It would be nice, if
def asNdigitBinary (source: Int, digits: Int): String = {
val l = BigInt (source.toBinaryString.toLong)
String.format ("%0" + digits + "d", l)}
would work, but "%0Nd" does not match for BigInt digits. Maybe a Bugreport/Feature request should be made? But to Scala or Java?
I usually use to prepend zeroes of the wanted length -1 and then just chop the rightmost characters:
"0000000" + 3.toBinaryString takeRight 8
This works fine for negative values as well.
scala> 3.toBinaryString
res0: String = 11
Scala has an implicit conversion from Int to RichInt which has a method toBinaryString. This function does not print the leading zeroes though.
This will print the leading zeroes:
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)
}
I don't know of a direct API method to do it, but here is one way of doing it:
def toBinary(i: Int, digits: Int = 8) =
String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0')
You can do something like this:
scala> val x = 3
x: Int = 3
scala> Integer.toString(x, 2)
res4: java.lang.String = 11
As with other suggestions, this doesn't have leading zeros...