2012-02-25 2 views
28

스칼라에는 바이너리 데이터 용 포맷터가 내장되어 있습니까? 인쇄하기 예를 들어스칼라에서 바이너리 값 서식 지정

: 00000011 하나는 어렵지 않을 것이다 쓰기 int 값 3.

을위한 - 존재하는 경우 그냥 궁금.

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

답변

56
scala> 3.toBinaryString 
res0: String = 11 

스칼라는 방법이있는 RichInt하는 지능에서 암시 적 변환이 있습니다

내가 직접 API의 방법을 모르는
20

여기에 그것을 할 만 할 그 일을하는 한 가지 방법입니다 toBinaryString. 이 함수는 선행 0을 인쇄하지 않습니다.

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

그냥 라 우리의 대답처럼, 그것은 앞의 0을 인쇄하지 않습니다

+1

+1을 추가하는 경우 +1 ;-) – Jack

+0

@JacobusR Thanks. 실제로 나는 당신이 질문 한 내용에 대해 당신이 질문 한 내용이라고 생각합니다. "변환기가 아닌 내장 된 * 포맷터"를 요구합니다!그것이 가능한 변수에 저장하는 대신에 결과를 출력하는 것을 제외 –

2

여기에 또 하나의 방법 (기존 자바)입니다.

+0

내가 스칼라 – Jack

0

당신은 같은 것을 수행 할 수 있습니다

scala> val x = 3 
x: Int = 3 

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

은 다른 제안과 마찬가지로,이 앞에 0이없는을 ... 0을 선두에 추가해, 3 번에 대한

9

8 자리 :

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

Hosam Aly가 String을 만들 것을 제안 했으므로 여기에 방법을 사용하십시오.

이진 값은 긴 매우 빠르게 얻을 수 있기 때문에 긴을 사용하는 일반적인 경우

는 더 적합 :

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

그래서 명심 - 숫자로 숫자를 생성하고이를 채우는 selfmade, 재귀 적 접근 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 숫자에 대한 일치하지 않는 경우. 어쩌면 버그 리포트/기능 요청을해야할까요? 하지만 스칼라 또는 Java?

+0

에서 자바를 사용하는 방법에 대한 악한 아무것도 잊고 계속이 좋은 답변입니다. '및 String.format ("%의 08D"3.toBinaryString.toInt.asInstanceOf [오브젝트]) @HosamAly' –

+0

: 당신이 대신 시도해 볼 수도 있습니다'예를 들어 인쇄하기 : 00000011을 3.' –

+0

좋은 int 값에 대한 잡기. :) 그럼에도 불구하고 답변에 일반 버전을 추가하는 것이 중요합니다. 나는 그것을 나의 것에 추가했을 것이다. 그러나 나는 그것이 당신의 생각이라고 믿는다. –

1

이가 앞에 0이 인쇄됩니다 :

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 

이 음수 잘 작동 값도 포함됩니다.