strncpyz(final, b, len);
}
-void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const char *units, const char *label_color, const char *value_color, int value_is_null) {
+void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const char *units, const char *label_color, const char *value_color, int value_is_null, int precision) {
char label_buffer[256 + 1], value_string[512 + 1], value_color_buffer[256 + 1];
char label_escaped[256 + 1], value_escaped[512 + 1], label_color_escaped[256 + 1], value_color_escaped[256 + 1];
int label_width, value_width, total_width;
if(value_is_null)
strcpy(value_string, "-");
- else {
+ else if(precision < 0) {
calculated_number abs = (value < (calculated_number)0)?-value:value;
if(abs > (calculated_number)1000.0) snprintfz(value_string, 512, "%0.0Lf%s%s", (long double)value, separator, units);
else if(abs > (calculated_number)100.0) snprintfz(value_string, 512, "%0.1Lf%s%s", (long double)value, separator, units);
else if(abs > (calculated_number)0.1) snprintfz(value_string, 512, "%0.3Lf%s%s", (long double)value, separator, units);
else snprintfz(value_string, 512, "%0.4Lf%s%s", (long double)value, separator, units);
}
+ else {
+ if(precision > 50) precision = 50;
+ snprintfz(value_string, 512, "%0.*Lf%s%s", precision, (long double)value, separator, units);
+ }
// we need to copy the label, since verdana11_width may write to it
strncpyz(label_buffer, label, 256);
#ifndef NETDATA_WEB_BUFFER_SVG_H
#define NETDATA_WEB_BUFFER_SVG_H 1
-extern void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const char *units, const char *label_color, const char *value_color, int value_is_null);
+extern void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const char *units, const char *label_color, const char *value_color, int value_is_null, int precision);
#endif /* NETDATA_WEB_BUFFER_SVG_H */
, *units = NULL
, *label_color = NULL
, *value_color = NULL
- , *refresh_str = NULL;
+ , *refresh_str = NULL
+ , *precision_str = NULL;
int group = GROUP_AVERAGE;
uint32_t options = 0x00000000;
else if(!strcmp(name, "multiply")) multiply_str = value;
else if(!strcmp(name, "divide")) divide_str = value;
else if(!strcmp(name, "refresh")) refresh_str = value;
+ else if(!strcmp(name, "precision")) precision_str = value;
}
if(!chart || !*chart) {
RRDSET *st = rrdset_find(chart);
if(!st) st = rrdset_find_byname(chart);
if(!st) {
- buffer_svg(w->response.data, "chart not found", 0, "", NULL, NULL, 1);
+ buffer_svg(w->response.data, "chart not found", 0, "", NULL, NULL, 1, -1);
ret = 200;
goto cleanup;
}
- long long multiply = (multiply_str && *multiply_str)?atol(multiply_str):1;
- long long divide = (divide_str && *divide_str )?atol(divide_str):1;
- long long before = (before_str && *before_str )?atol(before_str):0;
- long long after = (after_str && *after_str )?atol(after_str):-st->update_every;
- int points = (points_str && *points_str )?atoi(points_str):1;
+ long long multiply = (multiply_str && *multiply_str )?atol(multiply_str):1;
+ long long divide = (divide_str && *divide_str )?atol(divide_str):1;
+ long long before = (before_str && *before_str )?atol(before_str):0;
+ long long after = (after_str && *after_str )?atol(after_str):-st->update_every;
+ int points = (points_str && *points_str )?atoi(points_str):1;
+ int precision = (precision_str && *precision_str)?atoi(precision_str):-1;
int refresh = 0;
if(refresh_str && *refresh_str) {
buffer_sprintf(w->response.header, "Refresh: %d\r\n", refresh);
// render the badge
- buffer_svg(w->response.data, label, n * multiply / divide, units, label_color, value_color, value_is_null);
+ buffer_svg(w->response.data, label, n * multiply / divide, units, label_color, value_color, value_is_null, precision);
return ret;
cleanup: