Aion-Format
view release on metacpan or search on metacpan
lib/Aion/Format.pm view on Meta::CPAN
return sprintf "%.7f ms", $interval*1000 if 0 == int($interval*1000);
return sprintf "%.8f s", $interval;
}
my $hours = int($interval / (60*60));
my $minutes = int(($interval - $hours*60*60) / 60);
my $seconds = int($interval - $hours*60*60 - $minutes*60);
my $last = sprintf "%.3f", $interval - $hours*60*60 - $minutes*60 - $seconds;
sprintf "%02i:%02i:%02i.%s", $hours, $minutes, $seconds, $last =~ s!^0\.!!r
}
#@category ЦиÑÑÑ
# пеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð² ÑимÑкÑÑ ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ
# N - нолÑ
# ЧеÑез каждÑÑ 1000 ÑÑавиÑÑÑ Ð¿Ñобел (ÑазделиÑÐµÐ»Ñ ÑазÑÑдов)
our @RIM_CIF = (
[ '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' ],
[ '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC' ],
[ '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM' ]
);
sub rim($) {
my ($a) = @_;
use bigint; $a+=0;
my $s;
for ( ; $a != 0 ; $a = int( $a / 1000 ) ) {
my $v = $a % 1000;
if ( $v == 0 ) {
$s = "M $s";
}
else {
my $d;
for ( my $i = 0, $d = "" ; $v != 0 ; $v = int( $v / 10 ), $i++ ) {
my $x = $v % 10;
$d = $RIM_CIF[$i][$x] . $d;
}
$s = "$d $s";
}
}
$s //= "N";
$s =~ s/ \z//;
$s
}
# ÐÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð· кодиÑовки cp1251, ÑÑо нÑжно Ð´Ð»Ñ ÐºÐ¾ÑÑекÑной запиÑи в ÑаблиÑÑ
our $CIF = join "", "0".."9", "A".."Z", "a".."z", "_-", # 64 Ñимвола Ð´Ð»Ñ 64-ÑиÑной ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ
(map chr, ord "Ð" .. ord "Я"), "ÐÐÐÐÐÐÐÐÐÐÒÐÐÐÐ
",
(map chr, ord "а" .. ord "Ñ"), "ÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑ",
"âââ¦â â¡â¬â°â¹âââââ¢âââ¢âºÂ¤Â¦Â§Â©Â«Â¬Â®°±µ¶·â»", do { no utf8; chr 0xa0 }, # небÑквеннÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð· cp1251
"!\"#\$%&'()*+,./:;<=>?\@[\\]^`{|}~", # ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÑнкÑÑаÑии ASCII
" ", # пÑобел
(map chr, 0 .. 0x1F, 0x7F), # ÑпÑавлÑÑÑие ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ASCII
# Ñимвол 152 (0x98) в cp1251 оÑÑÑÑÑÑвÑеÑ.
;
# ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð½Ð°ÑÑÑалÑное ÑиÑло в заданнÑÑ ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ
sub to_radix($;$) {
use bigint;
my ($n, $radix) = @_;
$radix //= 64;
die "to_radix: The number system $radix is too large. Use NS before " . (1 + length $CIF) if $radix > length $CIF;
$n+=0; $radix+=0;
my $x = "";
for(;;) {
my $cif_idx = $n % $radix;
my $cif = substr $CIF, $cif_idx, 1;
$x =~ s/^/$cif/;
last unless $n = int($n / $radix);
}
return $x;
}
# ÐаÑÑÐ¸Ñ Ð½Ð°ÑÑÑалÑное ÑиÑло в Ñказанной ÑиÑÑеме ÑÑиÑлениÑ
sub from_radix(@) {
use bigint;
my ($s, $radix) = @_;
$radix //= 64;
$radix+=0;
die "from_radix: The number system $radix is too large. Use NS before " . (1 + length $CIF) if $radix > length $CIF;
my $x = 0;
for my $ch (split "", $s) {
$x = $x*$radix + index $CIF, $ch;
}
return $x;
}
# ÐкÑÑглÑÐµÑ Ð´Ð¾ Ñказанного ÑазÑÑда ÑиÑла
sub round($;$) {
my ($x, $dec) = @_;
$dec //= 0;
my $prec = 10**$dec;
int($x*$prec + 0.5) / $prec
}
#@category ÐеÑÑ (measure)
# добавлÑÐµÑ ÑазделиÑели Ð¼ÐµÐ¶Ð´Ñ ÑазÑÑдами ÑиÑла
sub num($) {
my ($s) = @_;
my $sep = " "; # ÐеÑазÑÑвнÑй пÑобел
my $dec = ".";
($s, $sep, $dec) = @$s == 2? @$s: (@$s, $dec) if ref $s;
my ($x, $y) = split /\./, $s;
$y = "$dec$y" if defined $y;
$x = reverse $x;
$x =~ s!\d{3}!$&$sep!g;
$x =~ s!$sep([+-]?)$!$1!;
reverse($x) . $y;
}
# ÐобавлÑÐµÑ ÑазÑÑÐ´Ñ ÑиÑел и добавлÑÐµÑ ÐµÐ´Ð¸Ð½Ð¸ÑÑ Ð¸Ð·Ð¼ÐµÑениÑ
sub kb_size($) {
my ($n) = @_;
return num(round($n / 1024 / 1024 / 1024)) . "G" if $n >= 1024 * 1024 * 1024;
return num(round($n / 1024 / 1024)) . "M" if $n >= 1024 * 1024;
return num(round($n / 1024)) . "k" if $n >= 1024;
return num(round($n)) . "b";
}
# ÐÑÑавлÑÐµÑ $n ÑиÑÑ Ð´Ð¾ и поÑле ÑоÑки: 10.11 = 10, 0.00012 = 0.00012, 1.2345 = 1.2, еÑли $n = 2
sub sround($;$) {
my ($number, $digits) = @_;
$digits //= 2;
my $num = sprintf("%.100f", $number);
$num =~ /^-?0?(\d*)\.(0*)[1-9]/;
return "" . round($num, $digits + length $2) if length($1) == 0;
my $k = $digits - length $1;
return "" . round($num, $k < 0? 0: $k);
}
# ÐибибайÑ
sub KiB() { 2**10 }
# ÐебибайÑ
sub MiB() { 2**20 }
# ÐибибайÑ
sub GiB() { 2**30 }
# ТебибайÑ
sub TiB() { 2**40 }
# ÐакÑимÑм в даннÑÑ
TinyText ÐаÑии
sub xxS() { 255 }
# ÐакÑимÑм в даннÑÑ
Text ÐаÑии
sub xxR() { 64*KiB-1 }
# ÐакÑимÑм в даннÑÑ
MediumText ÐаÑии
sub xxM() { 16*MiB-1 }
# ÐакÑимÑм в даннÑÑ
LongText ÐаÑии
sub xxL() { 4*GiB-1 }
#@category ÐонвеÑÑоÑÑ
# Ðаппинг индекÑа ФлеÑа Ð´Ð»Ñ Ñеловеков
my %FLESCH_INDEX_NAMES = (
100 => "Ð´Ð»Ñ Ð¼Ð»Ð°Ð´ÑеклаÑÑников",
90 => "Ð´Ð»Ñ 11 Ð»ÐµÑ (ÑÑÐ¾Ð²ÐµÐ½Ñ 5-го клаÑÑа)",
80 => "Ð´Ð»Ñ 12 Ð»ÐµÑ (6-й клаÑÑ)",
70 => "Ð´Ð»Ñ 13 Ð»ÐµÑ (7-й клаÑÑ)",
60 => "Ð´Ð»Ñ 8-Ñ
и 9-Ñ
клаÑÑов",
50 => "Ð´Ð»Ñ 10-Ñ
, 12-Ñ
клаÑÑов",
40 => "Ð´Ð»Ñ ÑÑÑденÑов",
30 => "Ð´Ð»Ñ Ð±Ð°ÐºÐ°Ð»Ð°Ð²Ñов",
20 => "Ð´Ð»Ñ Ð¼Ð°Ð³Ð¸ÑÑÑов",
10 => "Ð´Ð»Ñ Ð¿ÑоÑеÑÑионалов",
0 => "Ð´Ð»Ñ Ð°ÐºÐ°Ð´ÐµÐ¼Ð¸ÐºÐ¾Ð²",
);
sub flesch_index_human($) {
my ($flesch_index) = @_;
$FLESCH_INDEX_NAMES{int($flesch_index / 10) * 10} // "неÑвÑзнÑй ÑÑÑÑкий ÑекÑÑ"
}
1;
__END__
=encoding utf-8
=head1 NAME
Aion::Format - a Perl extension for formatting numbers, coloring output, etc.
=head1 VERSION
lib/Aion/Format.pm view on Meta::CPAN
=head2 trans ($s)
Transliterates Russian text, leaving only Latin letters and dashes.
trans "ÐÐ¸Ñ Ð²Ð¾ вÑÑм ÐиÑе!" # => mir-vo-vsjom-mire
=head2 transliterate ($s)
Transliterates Russian text.
transliterate "ÐÐ¸Ñ Ð²Ð¾ вÑÑм ÐиÑе!" # => Mir vo vsjom Mire!
=head2 trapperr (&block)
Trap for B<STDERR>.
If there is an error in the block, C<STDOUT> is restored, but the output in the block is lost.
trapperr { print STDERR "Stars: â¨" } # => Stars: â¨
See also C<IO::Capture::Stderr>.
=head2 trappout (&block)
Trap for B<STDOUT>.
If there is an error in the block, C<STDOUT> is restored, but the output in the block is lost.
trappout { print "Stars: â¨" } # => Stars: â¨
trappout { print "Stars: â¨"; die "error" } # @=> error
See also C<IO::Capture::Stdout>.
=head2 TiB ()
The constant is equal to one tebibyte.
TiB # -> 2**40
=head2 GiB ()
The constant is equal to one gibibyte.
GiB # -> 2**30
=head2 MiB ()
The constant is equal to one mebibyte.
MiB # -> 2**20
=head2 KiB ()
The constant is equal to one kibibyte.
KiB # -> 2**10
=head2 xxL ()
Maximum length of LongText mysql and mariadb data.
L - large.
xxL # -> 4*GiB-1
=head2 xxM ()
Maximum length of MediumText mysql and mariadb data.
M - medium.
xxM # -> 16*MiB-1
=head2 xxR ()
Maximum text length of mysql and mariadb data.
R - regularity.
xxR # -> 64*KiB-1
=head2 xxS ()
Maximum length of TinyText mysql and mariadb data.
S - small.
xxS # -> 255
=head2 to_str (;$scalar)
Convert to Perl string without interpolation.
to_str "a'\n" # => 'a\\'\n'
[map to_str, "a'\n"] # --> ["'a\\'\n'"]
=head2 from_str (;$one_quote_str)
Conversion from Perl string without interpolation.
from_str "'a\\'\n'" # => a'\n
[map from_str, "'a\\'\n'"] # --> ["a'\n"]
=head1 SUBROUTINES/METHODS
=head1 AUTHOR
Yaroslav O. Kosmina L<mailto:dart@cpan.org>
=head1 LICENSE
â B<GPLv3>
=head1 COPYRIGHT
Aion::Format is copyright © 2023 by Yaroslav O. Kosmina. Rusland. All rights reserved.
( run in 1.014 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )