author | Kim Alvefur <zash@zash.se> |
Sat, 23 Mar 2024 20:48:19 +0100 | |
changeset 13465 | c673ff1075bd |
parent 12593 | 39ae08180c81 |
permissions | -rw-r--r-- |
10893
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
1 |
local math_abs = math.abs; |
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
2 |
local math_ceil = math.ceil; |
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
3 |
local math_floor = math.floor; |
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
4 |
local math_log = math.log; |
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
5 |
local math_max = math.max; |
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
6 |
local math_min = math.min; |
12593
39ae08180c81
compat: Remove handling of Lua 5.1 location of 'unpack' function
Kim Alvefur <zash@zash.se>
parents:
12577
diff
changeset
|
7 |
local unpack = table.unpack; |
10892
42a0d9089de9
util.human.units: Handle location of unpack() in Lua 5.1
Kim Alvefur <zash@zash.se>
parents:
10890
diff
changeset
|
8 |
|
10890
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 |
local large = { |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
"k", 1000, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 |
"M", 1000000, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 |
"G", 1000000000, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 |
"T", 1000000000000, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 |
"P", 1000000000000000, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 |
"E", 1000000000000000000, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 |
"Z", 1000000000000000000000, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 |
"Y", 1000000000000000000000000, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 |
} |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 |
local small = { |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 |
"m", 0.001, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 |
"μ", 0.000001, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 |
"n", 0.000000001, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 |
"p", 0.000000000001, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 |
"f", 0.000000000000001, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
"a", 0.000000000000000001, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 |
"z", 0.000000000000000000001, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
"y", 0.000000000000000000000001, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 |
} |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 |
|
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 |
local binary = { |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
"Ki", 2^10, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 |
"Mi", 2^20, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 |
"Gi", 2^30, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 |
"Ti", 2^40, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 |
"Pi", 2^50, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 |
"Ei", 2^60, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 |
"Zi", 2^70, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 |
"Yi", 2^80, |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 |
} |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 |
|
10907
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
41 |
local function adjusted_unit(n, b) |
10893
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
42 |
local round = math_floor; |
10890
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 |
local prefixes = large; |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 |
local logbase = 1000; |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 |
if b == 'b' then |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 |
prefixes = binary; |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 |
logbase = 1024; |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 |
elseif n < 1 then |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 |
prefixes = small; |
10893
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
50 |
round = math_ceil; |
10890
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 |
end |
10893
25e0ec11b4e4
util.human.units: Put math functions into locals
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
52 |
local m = math_max(0, math_min(8, round(math_abs(math_log(math_abs(n), logbase))))); |
10892
42a0d9089de9
util.human.units: Handle location of unpack() in Lua 5.1
Kim Alvefur <zash@zash.se>
parents:
10890
diff
changeset
|
53 |
local prefix, multiplier = unpack(prefixes, m * 2-1, m*2); |
10907
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
54 |
return multiplier or 1, prefix; |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
55 |
end |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
56 |
|
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
57 |
-- n: number, the number to format |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
58 |
-- unit: string, the base unit |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
59 |
-- b: optional enum 'b', thousands base |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
60 |
local function format(n, unit, b) --> string |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
61 |
local fmt = "%.3g %s%s"; |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
62 |
if n == 0 then |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
63 |
return fmt:format(n, "", unit); |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
64 |
end |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
65 |
local multiplier, prefix = adjusted_unit(n, b); |
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
66 |
return fmt:format(n / multiplier, prefix or "", unit); |
10890
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 |
end |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 |
|
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 |
return { |
10907
c5f26f9adb31
util.human.units: Factor out function for getting multiplier
Kim Alvefur <zash@zash.se>
parents:
10894
diff
changeset
|
70 |
adjust = adjusted_unit; |
10890
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 |
format = format; |
994c4a333199
util.human.units: A library for formatting numbers with SI units
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 |
}; |