format.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /***************************************************
  2. * these routines determine the printf format used
  3. * by floating point values
  4. *
  5. * format_parms() is called for each value.
  6. * before first call set eformat=0,dp=6
  7. *
  8. * format_double() does the formating with the
  9. * parms determined by format_parms()
  10. ***************************************************/
  11. #include <string.h>
  12. #include "global.h"
  13. int format_parms(double v, int *n, int *dp, int *eformat, int e_option)
  14. {
  15. char buf[50];
  16. int orig_length, scient_dp;
  17. orig_length = *n;
  18. scient_dp = *dp;
  19. for (;;) {
  20. if (!*eformat)
  21. format_double(v, buf, *n, *dp);
  22. else
  23. scient_format(v, buf, *n, *dp);
  24. if (strlen(buf) <= *n)
  25. break;
  26. if (*dp) {
  27. *dp -= 1;
  28. }
  29. else {
  30. if ((e_option) && (!*eformat)) {
  31. *eformat = 1;
  32. *dp = scient_dp;
  33. }
  34. else
  35. *n = strlen(buf);
  36. }
  37. }
  38. return 0;
  39. }
  40. int scient_format(double v, char *buf, int n, int dp)
  41. {
  42. char temp[50];
  43. int i;
  44. sprintf(temp, "%#.*g", dp, v);
  45. for (i = 0; i <= n && temp[i] == ' '; i++) {
  46. }
  47. strcpy(buf, temp + i);
  48. return 0;
  49. }
  50. int format_double(double v, char *buf, int n, int dp)
  51. {
  52. char fmt[15];
  53. char temp[100];
  54. int i, ncommas;
  55. sprintf(fmt, "%%%d.%df", n, dp);
  56. sprintf(temp, fmt, v);
  57. strcpy(buf, temp);
  58. G_insert_commas(temp);
  59. ncommas = strlen(temp) - strlen(buf);
  60. for (i = 0; i < ncommas && temp[i] == ' '; i++) {
  61. }
  62. strcpy(buf, temp + i);
  63. return 0;
  64. }