Logo

Programming-Idioms

This language bar is your friend. Select your favorite languages!

Idiom #364 Calculate the magnitude symbol for a value

Calculate the SI (International System of Units) prefix, x, of value a.

For example, 'k', 'M', 'G', 'T', etc.

https://en.wikipedia.org/wiki/Metric_prefix

from math import log
y = int(log(a, 1_000))
a = a / (1_000 ** y)
x = 'kMGT'[y - 1]
m = zip('TGMk', (1e12, 1e9, 1e6, 1e3))
x = None
for k, v in m:
    if a >= v:
        x = (k, v)
        break
import static java.lang.Math.log;
import static java.lang.Math.pow;
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 = a / pow(1_000, si.ordinal() + 1);
String x = si.name();
import static java.lang.Math.log;
import static java.lang.Math.pow;
char x, c[] = "kMGT".toCharArray();
int y = (int) (log(a) / log(1_000));
a = a / pow(1_000, y);
x = c[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;
x =  case a
  when 1e3... 1e6 ; "k"
  when 1e6... 1e9 ; "M"
  when 1e9... 1e12; "G"
  when 1e12...1e15; "T"
  else ""
end

New implementation...
< >
reilas