-1

如何使用 C++ Builder String 类以工程符号显示浮点数?(Unicode 字符串)

当然必须存在为此的预制功能吗?我找不到一个。我唯一遇到的是 String::FloatToStrF(),但它似乎不支持工程符号。

4

2 回答 2

1

这是以工程符号打印的代码,从该站点按原样提取。我不认为这有任何功劳。

#define MICRO "µ"

#define PREFIX_START (-24)
/* Smallest power of then for which there is a prefix defined.
   If the set of prefixes will be extended, change this constant
   and update the table "prefix". */

#include <stdio.h>
#include <math.h>

char *eng(double value, int digits, int numeric)
{
  static char *prefix[] = {
  "y", "z", "a", "f", "p", "n", MICRO, "m", "",
  "k", "M", "G", "T", "P", "E", "Z", "Y"
  }; 
#define PREFIX_END (PREFIX_START+\
(int)((sizeof(prefix)/sizeof(char *)-1)*3))

      int expof10;
      static unsigned char result[100];
      unsigned char *res = result;

      if (value < 0.)
        {
            *res++ = '-';
            value = -value;
        }
      if (value == 0.)
        {
        return "0.0";
        }

      expof10 = (int) log10(value);
      if(expof10 > 0)
        expof10 = (expof10/3)*3;
      else
        expof10 = (-expof10+3)/3*(-3); 

      value *= pow(10,-expof10);

      if (value >= 1000.)
         { value /= 1000.0; expof10 += 3; }
      else if(value >= 100.0)
         digits -= 2;
      else if(value >= 10.0)
         digits -= 1;

      if(numeric || (expof10 < PREFIX_START) ||    
                    (expof10 > PREFIX_END))
        sprintf(res, "%.*fe%d", digits-1, value, expof10); 
      else
        sprintf(res, "%.*f %s", digits-1, value, 
          prefix[(expof10-PREFIX_START)/3]);
      return result;
}
于 2012-06-01T02:38:45.627 回答
0

如果科学记数法适合您,您可以使用stringstream

std::stringstream s;
double x = 0.0005;
s << std::scientific << x;

这应该会给你类似“5.000000e-04”的东西。

如果你真的需要工程符号,你可以自己写一个像这样的转换(我知道这绝不是为速度优化的):

#include <math.h>

SomeSortOfString floatToEngineering(double x)
{
    int exp = 0, sign = 1;
    if (x < 0.0) {
        x = -x;
        sign = -sign;
    }
    while (x >= 1000.0) {
        x /= 1000.0;
        exp += 3;
    }
    while (x < 1.0) {
        x *= 1000.0;
        exp -= 3;
    }
    if (sign < 0)
        x = -x;
    return floatToSomeSortOfString(x) + "e" + intToSomeSortOfString(exp);
}

如果您使用对数,您可以简化它以摆脱循环除法/乘法。

于 2012-05-29T14:39:38.520 回答