filey/filey/preamble/magnitudes.py

122 lines
4.1 KiB
Python

"""
Compute the correct order of magnitude of an integer in a given dimension
"""
all = [
'represent',
'force',
]
from dataclasses import dataclass
# from m3ta import sample,show,nopes
from sl4ng import sample,nopes
orders = {
0:'mono',
1:'deca',
2:'hecto',
3:'kilo',
6:'mega',
9:'giga',
12:'tera',
15:'peta',
18:'exa',
21:'zetta',
24:'yotta',
}
sredro = {v:k for k,v in orders.items()}
pretty = lambda number,unit='': f'{number:,} {unit}'.strip()
setcase = lambda unit,lower=False: [unit.upper().strip(),unit.lower().strip()][lower]
setlength = lambda mag,dim,long=False,sep='-': ('',sep)[long].join(((mag[0],dim[0]),(mag,dim))[long])
# def getmagnitude(value,never='mono deca hecto'.split()):
# mags = tuple(sorted(i for i in orders.keys() if not orders[i] in never))
# booly = lambda i: len(str(int(value))) < len(str(10**mags[i+1]))
# fits = tuple(nopes((booly(i) for i in range(len(mags)-1)),True))
# fit = mags[min(fits) if fits else len(mags)-1]
# return orders[fit]
def magnitude(value,omissions='mono deca hecto'.split()):
mags = tuple(sorted(i for i in orders.keys() if not orders[i] in omissions))
booly = lambda i: len(str(int(value))) < len(str(10**mags[i+1]))
fits = tuple(nopes((booly(i) for i in range(len(mags)-1)),True))
fit = mags[min(fits) if fits else len(mags)-1]
return orders[fit]
# def represent(self,dim='bytes',long=False,lower=False,precision=2,sep='-',omissions='mono deca hecto'.split()):
# mag = magnitude(self,omissions)
# unit = setcase(setlength(mag,dim,long,['',sep][long]),lower)
# number = round(self*10**-sredro[mag],precision)
# out = pretty(number,unit)
# return (out.upper(),out.lower())[lower]
def represent(self,dim='bytes',long=False,lower=False,precision=2,sep='-',omissions='mono deca hecto'.split()):
return force(self,mag=magnitude(self,omissions),dim=dim,long=long,lower=lower,precision=precision,sep=sep)
def force(self,mag='kilo',dim='bytes',long=False,lower=False,precision=2,sep='-'):
# precision = sredro[mag]
unit = setcase(setlength(mag,dim,long,sep),lower)
val = round(self*10**-(sredro[mag]),precision)
return pretty(val,unit)
def f2(self,dim='bytes',long=False,lower=False,precision=2,sep='-',omissions='mono deca hecto'.split()):
"""
This should behave well on int subclasses
"""
mag = magnitude(self,omissions)
precision = sredro[mag] if self<5 else precision
unit = setcase(setlength(mag,dim,long,sep),lower)
val = round(self*10**-(sredro[mag]),precision)
return pretty(val,unit)
def file_size(self,dim='bytes',mag='kilo',long=False,lower=False,precision=2,sep='-',never='mono deca hecto'.split(),force=False):
if force:
return force(self,mag=mag,dim=dim,long=long,lower=lower,precision=precision,sep=sep)
return rep(self,dim=dim,long=long,lower=lower,precision=precision,sep=sep,never=never)
if __name__ == '__main__':
band = lambda level,base=10,shift=0,root=1: tuple(root+i+shift for i in ((level+1)*base,level*base))[::-1]
format = lambda selection: int(''.join(str(i) for i in selection))
digits = range(*band(0))
l = 0
s = 0
b = 30
r = 1
x,y = band(l,b,s,r)
# print(x,y)
val = sample(digits,y)
sizes = [format(val[:i][::-1]) for i in range(x,y)]
# show(sizes)
# sizes = [44259260028,315436]
for size in sizes[::-1]:
# print(
string = f"""{(len(pretty(max(sizes)))-len(pretty(size)))*' '+pretty(size)}
{size = }
{len(str(size)) = }
{force(size) = }
{force(size,mag=magnitude(size)) = }
{f2(size) = }
{represent(size) = }
{magnitude(size) = }
""".splitlines()
print(*((x.strip(),x)[i<1] for i,x in enumerate(string)),sep='\n\t',end='\n\n')
# )
print(pretty(sizes[-1]))
print(band(l,s,b,r))
print(x,y)
print(f'{format(digits):,}')
# print(all(rep(size)==rep2(size) for size in sizes))