roo_quantity
API Documentation for roo_quantity
Loading...
Searching...
No Matches
si.cpp
Go to the documentation of this file.
1#include "roo_quantity/si.h"
2
3#include <cmath>
4#include <cstdio>
5
6namespace roo_quantity {
7
8void FormatSimpleSiValue(float val, const char* base_unit, char* out,
9 int maxlen) {
10 if (isnanf(val)) {
11 snprintf(out, maxlen, "? %s", base_unit);
12 return;
13 }
14 if (val == 0.0f) {
15 snprintf(out, maxlen, "0 %s", base_unit);
16 return;
17 }
18 const char* prefix;
19 const char* sign = "";
20 if (val < 0.0f) {
21 sign = "-";
22 val = -val;
23 }
24 if (std::isinf(val)) {
25 snprintf(out, maxlen, "%s∞ %s", sign, base_unit);
26 return;
27 }
28 if (val >= 1000000000000000.0f) {
29 prefix = "P";
30 val *= 0.000000000000001;
31 } else if (val >= 1000000000000.0f) {
32 prefix = "T";
33 val *= 0.000000000001;
34 } else if (val >= 1000000000.0f) {
35 prefix = "G";
36 val *= 0.000000001;
37 } else if (val >= 1000000.0f) {
38 prefix = "M";
39 val *= 0.000001;
40 } else if (val >= 1000.0f) {
41 prefix = "k";
42 val *= 0.001;
43 } else if (val >= 1.0f) {
44 prefix = "";
45 } else if (val >= 0.001f) {
46 prefix = "m";
47 val *= 1000.0f;
48 } else if (val >= 0.000001f) {
49 prefix = "µ";
50 val *= 1000000.0f;
51 } else if (val >= 0.000000001f) {
52 prefix = "n";
53 val *= 1000000000.0f;
54 } else {
55 prefix = "p";
56 val *= 1000000000000.0f;
57 }
58 snprintf(out, maxlen, "%s%g %s%s", sign, val, prefix, base_unit);
59}
60
61} // namespace roo_quantity
For convenience conversion from roo_time::Duration.
Definition area.cpp:3
void FormatSimpleSiValue(float val, const char *base_unit, char *out, int maxlen)
Formats a value with an SI prefix and base unit.
Definition si.cpp:8