using namespace std;
struct units {
double y;
vector<char> a;
units(int x) { y = log(x); }
void add(char x) { a.push_back(x); }
pair<int, char> get(int x) {
int i (log(x) / y);
return {i, a[i - 1]};
}
};
units u {1'000};
for (char x : "kMGT") u.add(x);
pair p {u.get(a)};
a /= pow(1'000, p.first);
char x {p.second};
int y (log(a) / log(1'000));
a /= pow(1'000, y);
char x {"kMGT"[y - 1]};
enum SI {
k("kilo"),
M("mega"),
G("giga"),
T("tera");
String s;
static double y = log(1_000);
SI(String s) { this.s = s; }
static SI get(double x) {
int y = (int) (log(x) / SI.y);
return values()[y - 1];
}
}
SI si = SI.get(a);
a /= pow(1_000, si.ordinal() + 1);
String x = si.name();
int y = (int) (log(a) / log(1_000));
a /= pow(1_000, y);
char x = "kMGT".charAt(y - 1);
function GetSIPrefix(AValue: Double): string;
const
SIPrefixes: array[1..24] of String = ('Q','R','Y', 'Z','E','P','T','G','M','K','H','D','','d','c','m','µ','mc','n','p','f','a','z','y');
SIFactors: array[1..24] of Double = (1E+30,1E+27,1E+24, 1E+21, 1E+18, 1E+15, 1E+12, 1E+9, 1E+6, 1E+3,1E+2,1E+1,1,1E-1,1E-2,
var
i: Integer;
begin
Result := '';
for i := 1 to 24 do
begin
if (Abs(AValue) >= SIFactors[i]) then
begin
Exit(SIPrefixes[i]);
end;
end;
end;
class Units(IntEnum):
b_ = nonmember(1_000)
k = 'kilo'
M = 'mega'
G = 'giga'
T = 'tera'
def __new__(_, x):
y = len(_._member_map_) + 1
y = _.b_ ** y
i = int.__new__(_, y)
i.x, i._value_ = x, y
return i
__str__ = lambda _: _.x
@classmethod
def parse(_, x):
y = int(log(x, _.b_))
return [*_][y - 1]
u = Units.parse(a)
s = f'{a / u} {u}bytes ({u.name}B)'
y = int(log(a, 1_000))
a /= 1_000 ** y
x = 'kMGT'[y - 1]
def f(x, s=printable, b=10):
m = lambda _, x: int.__new__(_, x)
n = lambda _: _.__class__.__name__
d = {'__new__': m, '__str__': n}
y = int(log(x, b))
x = type(s[y - 1], (int,), d)
return x(b ** y)
u = f(a, 'kMGT', 1_000)
s = f'{a / u} {u}B'
def m(_, s=printable, b=10):
_.b = b
m = lambda _, x: int.__new__(_, x)
n = lambda _: _.__class__.__name__
d = {'__new__': m, '__str__': n}
for y, x in enumerate(s, 1):
x = type(x, (int,), d)
_.append(x(b ** y))
n = lambda _, x: _[int(log(x, _.b)) - 1]
d = {'__init__': m, 'parse': n}
Units = type('Units', (list,), d)
u = Units('kMGT', 1_000)
u = u.parse(a)
s = f'{a / u} {u}B'
x = case a
when 1e3... 1e6 ; "k"
when 1e6... 1e9 ; "M"
when 1e9... 1e12; "G"
when 1e12...1e15; "T"
else ""
end