Czy Scala ma wbudowany formater do danych binarnych?Formatowanie wartości binarnych w Scali
Na przykład, aby wydrukować: 00.000.011 o wartości Int 3.
Pisanie nie będzie trudne - po prostu ciekawy, jeśli istnieje.
Czy Scala ma wbudowany formater do danych binarnych?Formatowanie wartości binarnych w Scali
Na przykład, aby wydrukować: 00.000.011 o wartości Int 3.
Pisanie nie będzie trudne - po prostu ciekawy, jeśli istnieje.
scala> 3.toBinaryString
res0: String = 11
Scala ma niejawna konwersja z Int do RichInt który ma metodę toBinaryString. Ta funkcja nie drukuje początkowych zer.
nie wiem bezpośredniej metody API to zrobić, ale tutaj jest jeden sposób to zrobić:
def toBinary(i: Int, digits: Int = 8) =
String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0')
Oto jeszcze jeden sposób (stary Java):
val x = 5
val str = Integer.toString(x,2)
Podobnie jak Lauri odpowiedź, to nie drukuje zera.
Ciągle zapominam, że nie ma nic złego w używaniu Javy w Scali – Jack
można zrobić coś takiego:
scala> val x = 3
x: Int = 3
scala> Integer.toString(x, 2)
res4: java.lang.String = 11
jak inne sugestie, to nie ma zer ...
8 cyfr dla numeru 3 z wiodącymi zerami:
printf ("%08d", 3.toBinaryString.toInt)
00000011
Ponieważ Hosam Aly sugeruje utworzenie ciągu znaków, można to zrobić:
def asNdigitBinary (source: Int, digits: Int): String = {
val l: java.lang.Long = source.toBinaryString.toLong
String.format ("%0" + digits + "d", l) }
W ogólnym przypadku, przy użyciu długi jest bardziej odpowiedni, ponieważ wartości binarne się długo bardzo szybko:
scala> asNdigitBinary (1024*512-1, 32)
res23: String = 00000000000001111111111111111111
więc miej to na uwadze - selfmade, rekurencyjnej podejście, które generuje cyfra po cyfrze i wypełnia je w końcu byłby łatwo przystosowany do obsługi dowolnych wartości 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
}
Byłoby miło, jeśli
def asNdigitBinary (source: Int, digits: Int): String = {
val l = BigInt (source.toBinaryString.toLong)
String.format ("%0" + digits + "d", l)}
będzie działać, ale "% 0Nd" nie pasuje do cyfr BigInt. Może powinien zostać zgłoszony błąd? Ale do Scali czy Javy?
Jest to dobra odpowiedź, z wyjątkiem tego, że drukuje wynik, zamiast przechowywać go w użytecznej zmiennej. Możesz spróbować tego zamiast: 'String.format ("% 08d ", 3.toBinaryString.toInt.asInstanceOf [Object])' –
@HosamAly: 'Na przykład, aby wydrukować: 00000011 dla wartości Int 3. ' –
Dobrze łapać. :) Niemniej jednak warto byłoby dodać ogólną wersję do swojej odpowiedzi. Dodałbym go do mojego, ale uważam, że to twój pomysł. –
To drukowanie zer:
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)
}
Zwykle używam do poprzedzić zer o długości poszukiwanych -1 a potem po prostu posiekać n ostatnich znaków:
"0000000" + 3.toBinaryString takeRight 8
Działa to dobrze dla ujemny również wartości.
+1 za dodanie zer ;-) – Jack
@JacobusR Dzięki. Właściwie uważam, że o to prosiliście, ponieważ w swoim pytaniu było całkiem jasne, prosząc o "wbudowany * formatter *", a nie konwerter! –