print unpack("B*",pack("N",$liczba)); # na bin
print unpack ("H2", pack ("C", $dec)); # na hex
printf "%x", $liczba; # na hex
do {
$wynik = chr(($reszta=$liczba % $podstawa) +
($reszta>9 ? 87:48)) . $wynik;
} while ($liczba = int ($liczba / $podstawa));
print "$wynik\n";
Zamień 87 na 55 by litery były duże.
oct('0b'.$_);
$a=reverse;$i=1;$_=0;$a=~s/./$_+=$i*$&,$i*=2/ge;
$s=0;for(split//){$s*=2;$s+=$_}$_=$s;
$s=0;($s*=2)+=$_ for/./g;$_=$s;
s/./$s=$s*2+$&/ge;$_=$s;
Jeśli ktoś potrzebuje zapisać słownie liczbę, poleca się
http://radek.karnet.pl/Number-SpellPolish-0.5.tar.gz
$zmienna =~ /^\d+$/
Bardziej zaawansowane sprawdzenie:
$ciag =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/
lub
$ciag =~ /^[+-]?\d+(\.\d*)?([eE][+-]?\d+)?$/;
$liczba=int($liczba+0.5); #Zaokraglanie do czesci calkowitej $liczba=sprintf "%.2f",$liczba; #Zaokraglanie do 2 miejsc $liczba=int($liczba); #wyrzucenie po przecinku
Przy zaokrąglaniu funkcją typu printf, sprawdź czy o takie zakrąglanie ci chodzi wpisując poniższe dwie linie (chodzi o zaokrąglanie przy równej odległości):
printf "%.0f", 0.5; printf "%.0f", 1.5;
Oprócz funkcji int, są jeszcze ceil i floor z modułu POSIX, działające według tabeli:
liczba int floor ceil 3.3 3.0 3.0 4.0 3.5 3.0 3.0 4.0 3.7 3.0 3.0 4.0 -3.3 -3.0 -4.0 -3.0
Funkcja ceil inaczej to:
int($x)==$x ? $x : int($x)+1
#Format po 3 cyfry
$string=scalar reverse join " ",grep length,split /(\d{3})/,reverse
$liczba;
#Zamiast powyższych 3 linii - dwa razy wolniej
1 while s/(.*\d)(\d{3})/$1 $2/;
Można też zastosować moduł Number::Format.
log10(x) = log (x) / log (10)
W większości zastosowań zamiast int(log($x)/log(10)+1) można stosować prostszą i szybszą konstrukcję (poza przedziałem (0,1) oraz zapisem typu 1e13):
length(int($x))
trochę wolniejsza, lecz poprawna dla dużych liczb jest
length(sprintf "%.0f", $x)
use constant true => 1; use constant false => 0;