| 133 | } |
| 134 | |
| 135 | DFHACK_EXPORT std::string format_number_by_sig_fig(double num, size_t sig_figs) { |
| 136 | if (num == 0) |
| 137 | return "0"; |
| 138 | |
| 139 | double absnum = std::abs(num); |
| 140 | int magnitude = get_magnitude(absnum); |
| 141 | auto & sig_data = sig_fig_db[magnitude]; |
| 142 | |
| 143 | int sf = (int)sig_figs; |
| 144 | if (sf < 1) sf = 1; |
| 145 | int precision = magnitude <= 4 ? std::max(0, sf - magnitude) : std::max(0, sf - (magnitude % 3)) % 3; |
| 146 | double divisor = sig_data.second; |
| 147 | double roundoff = divisor <= 1.0 ? 0 : 1.0 / (2.0 * std::pow(10, precision)); |
| 148 | |
| 149 | std::ostringstream ss; |
| 150 | ss << std::fixed << std::setprecision(precision) << std::copysign(absnum / divisor - roundoff, num) << sig_data.first; |
| 151 | return ss.str(); |
| 152 | } |
| 153 | |
| 154 | DFHACK_EXPORT std::string format_number_by_sig_fig(int64_t num, size_t sig_figs) { |
| 155 | if (std::abs(num) < 10000) { |
nothing calls this directly
no test coverage detected