/* START LIBRARY DESCRIPTION ********************************************* FLOAT.LIB Copyright (c) 2006, Avtech Electrosystems Ltd. DESCRIPTION: Functions that deal with strings and floating point numbers. SUPPORT LIB'S: END DESCRIPTION **********************************************************/ #include #include #include #include #include "globals.h" #include "string_utils.h" 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); } int String_trim_excess_digits(char *parameter) { /* this function takes a parameter like "1.2345678901234567890" and reduces it to "1.234567" */ /* so that atof() will work properly */ gchar* new_string = g_strdup(parameter); memset(new_string, 0, strlen(parameter)); int i; int j; int sig_digits; /* number of significant digits so far */ long exp_power; /* append an exponent of this power */ int sign; /* is the exponent negative? */ int start_of_exponent; /* location of exponent */ i=0; /* location in input string */ j=0; /* location in output string */ sig_digits=0; exp_power=0; sign=NO; #define max_sig_dig 8 if (!(isdigit(parameter[0]) || parameter[0]=='+' || parameter[0]=='-' || parameter[0]=='.')) { return OK; } /* take care of sign */ if (parameter[0]=='+' || parameter[0]=='-') { new_string[j]=parameter[i]; ++i; ++j; } /* leave in leading zeros */ while (parameter[i]=='0') { new_string[j]=parameter[i]; ++i; ++j; } /* leave in up to 8 pre-decimal significant digits */ while (isdigit(parameter[i]) && sig_digits0) { strcat(new_string+j,"e"); //replaced itoa (non standard) with sprintf char temp[64]; memset(temp, 0, 64); sprintf(temp, "%ld", exp_power); strcat(new_string,temp); strcpy(parameter,new_string); if (exp_power<38) { return OK; } else { return OutOfRange; } } /* leave in decimal point */ if (parameter[i]=='.') { new_string[j]=parameter[i]; ++i; ++j; } /* leave in post-decimal zeros if no significant digits yet */ while (parameter[i]=='0' && sig_digits==0) { new_string[j]=parameter[i]; ++i; ++j; } /* leave in up to 8 post-decimal significant digits */ while (isdigit(parameter[i]) && sig_digits37 && sign==NO) { g_free(new_string); return OutOfRange; } if (exp_power>37 && sign==YES) { strcpy(new_string,"0.0"); } } new_string[j]=0; strcpy(parameter,new_string); g_free(new_string); return OK; } /*----------------------------------------------------------------------------------------------------------*/ int String_is_it_numeric(char *parameter) { /* this function takes a parameter like "1e+6" or "on" and determines if it is numeric or not */ /* it is similar to the Parser_get_unit function */ // FIXME - replace in calling code with strtof gchar *testme = g_strdup (parameter); g_strstrip (parameter); char * p; strtof (testme, &p); g_free (testme); return *p == '\0'; }