#include #include #include #include #include "globals.h" #include "string_utils.h" #include "lcd.h" // FIXME void Float_To_Text(int decimal_digits,float number_in, gchar ** text_out) { g_assert (*text_out == NULL); if (fabs(number_in)<1.1*smallest_allowed_number) { if (number_in<0.0) { *text_out = g_strdup_printf("-0.%0*d",decimal_digits,0); } else { *text_out = g_strdup_printf("0.%0*d",decimal_digits,0); } return; } *text_out = g_strdup_printf("%.*e", decimal_digits, number_in); } gboolean String_is_it_numeric(char *parameter) { GRegex *numeric_regex = g_regex_new ( "\\s*[+-]?(\\d*\\.\\d+|\\d+(\\.\\d*)?)\\s*(e\\s*[+-]?\\d+)?\\s*", G_REGEX_CASELESS, 0, NULL); gboolean match = g_regex_match (numeric_regex, parameter, 0, NULL); g_regex_unref (numeric_regex); return match; } void String_Parameter_To_Text(float Float_To_Convert, int significant_digits, char *start_string,char *units,char *LCD_string,int show_plus_sign) { // FIXME - crappy string func gchar *floating_val = NULL; gchar *unit_mult = NULL; /* units multiplier, eg. M, k, u */ int i; /* just a counter */ int shift_decimal_by; /* if the exponent isn't a multiple of 3, the decimal point will be moved */ int decimal_location; /* where the decimal is in the number string */ int chars_processed; /* how many characters are in the parsed number string so far */ int exponent_val; /* the exponent, in integer form */ /* Copy the floating point value to a string. Do not multiply to accomodate units; the roundoff */ /* is annoying. (e.g. 1.000 -> 0.999) */ /* Move the decimal with string manipulations instead. */ strcpy(LCD_string,start_string); /* if significant_digits is zero, used the supplied integer rather than the floating number */ if (!significant_digits) { gchar *out_val; out_val = g_strdup_printf ("%d", (int) Float_To_Convert); strcat(LCD_string,out_val); g_free (out_val); } else { GString *out_gstr = g_string_new (""); Float_To_Text(remote_digits_after_decimal,Float_To_Convert,&floating_val); /* -- COPY FIRST ONE OR TWO CHARACTERS -- */ if (floating_val[0]=='-') { /* if it's negative ... */ decimal_location=2; /* decimal at position two (e.g.: -2.23e-9) */ chars_processed=2; /* two characters so far (e.g.: -2) */ out_gstr = g_string_append_c (out_gstr, '-'); /* copy minus sign */ out_gstr = g_string_append_c (out_gstr, floating_val[1]); /* copy first digit */ } else if (show_plus_sign==YES) { /* if it's positive and plus sign required ... */ decimal_location=1; /* decimal at position one (e.g.: 2.23e-9) */ chars_processed=2; /* two characters so far (e.g.: +2) */ out_gstr = g_string_append_c (out_gstr, '+'); /* copy minus sign */ out_gstr = g_string_append_c (out_gstr, floating_val[0]); /* copy first digit */ } else { /* if it's positive and plus sign not required ... */ decimal_location=1; /* decimal at position one (e.g.: 2.23e-9) */ chars_processed=1; /* one character so far (e.g.: 2) */ out_gstr = g_string_append_c (out_gstr, floating_val[0]); /* copy first digit */ } /* -- FIND EXPONENT -- */ /* find how much the decimal has to be moved, by examining the exponent in the string and */ /* modding it by 3 */ exponent_val = atoi(floating_val+strlen(floating_val)-3); /* read the last three characters */ /* e.g. +09, or -07 */ shift_decimal_by=(300+exponent_val) % 3; /* added 300 to keep everything positive */ /* -- PICK UNITS -- */ if (exponent_val<12 && exponent_val>=9) { unit_mult = g_strdup("G"); } else if (exponent_val<9 && exponent_val>=6) { unit_mult = g_strdup("M"); } else if (exponent_val<6 && exponent_val>=3) { unit_mult = g_strdup("k"); } else if (exponent_val<3 && exponent_val>=0) { unit_mult = g_strdup(""); } else if (exponent_val<0 && exponent_val>=-3) { unit_mult = g_strdup("m"); } else if (exponent_val<-3 && exponent_val>=-6) { unit_mult = g_strdup("u"); } else if (exponent_val<-6 && exponent_val>=-9) { unit_mult = g_strdup("n"); } else if (exponent_val<-9 && exponent_val>=-12) { unit_mult = g_strdup("p"); } else { unit_mult = g_strdup(""); /* if parameter=0, don't use silly units */ } /* -- MOVE DIGITS AROUND DECIMAL POINT -- */ /* move the digits that will come before the decimal */ for (i=decimal_location; istr); g_string_free (out_gstr, TRUE); LCD_string[strlen(LCD_string)-1]=0; /* remove extra digit */ /* -- CHECK FOR TERMINATING DECIMAL POINT -- */ if (LCD_string[strlen(LCD_string)-1]=='.') { LCD_string[strlen(LCD_string)-1]=0; } strcat(LCD_string,unit_mult); } strcat(LCD_string,units); g_free (floating_val); g_free (unit_mult); }