Alex Rivera | Logout

Formatting binary values in Scala

Asked 2012-02-25T08:00:23.480
37

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 if it exists.

Edit
Report

2 Answers

63
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.

answered 2012-02-25T08:06:46.027
10

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?

answered 2012-02-25T16:22:44.567

Your Answer