Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中带有%g的字符串格式_C_String_Format_Numbers - Fatal编程技术网

C中带有%g的字符串格式

C中带有%g的字符串格式,c,string,format,numbers,C,String,Format,Numbers,我如何创建一个字符串,使其格式化浮点数字,使其在为整数时没有尾随的小数点或数字,但对于较大的数字不切换为科学符号 当我这样做时: float myFloat= 15.6f; float myInt = 5.0f; float myLarge = 7000000.0f; sprintf(out, "my float is %g", myFloat); sprintf(out, "my int is %g", myInt); sprintf(out, "my large is %g", myLarg

我如何创建一个字符串,使其格式化浮点数字,使其在为整数时没有尾随的小数点或数字,但对于较大的数字不切换为科学符号

当我这样做时:

float myFloat= 15.6f;
float myInt = 5.0f;
float myLarge = 7000000.0f;
sprintf(out, "my float is %g", myFloat);
sprintf(out, "my int is %g", myInt);
sprintf(out, "my large is %g", myLarge);
我得到的结果是:

my float is 15.6 my int is 5 my large is 7e+07f
#include <math.h>
double x;
...
if (floor(x) == x && x != 0.0) { // x is an non-zero integer value
    int digits = floor(log10(fabs(x)+0.5)) + 1;
    printf("x is %.*f\n", digits, x);
}
你是怎么包装的

sprintf(buf, "%d %g", myInt, Wrapper(myFloat));??
包装器应该返回什么?或者更糟:

sprintf(buf, "%d %s", myInt, Wrapper(myFloat));?? 

您可以使用“%.*f”进行格式化,这允许您将精度作为单独的参数传递给例如sprintf。在过去,当我想显示0、1、2或3位数字时,我曾使用过这种方法,而不需要额外的尾随0。编写一个小的helper函数,它接受double/float并返回整数精度(乘以1000,然后进行模10、100、1000)。然后用“%.*f”调用sprintf,调用helper函数,并传递float。

我认为用
%g
无法实现这一点,因为
%g
给出了
%e
%f
中较短的一个

所以,我认为没有一个
printf
参数能让你满意。对于15.6,您可以使用
%2.1f
;对于7000000,您可以使用
%7.0f


您最好的选择可能是编写一个包装函数,该函数将查看您的值的大小,并应用正确的
printf
参数。

Mike的方法是合理的,但您可以直接使用log10函数计算位数,并使用floor或ceil来验证您是否确实有一个整数值。比如:

my float is 15.6 my int is 5 my large is 7e+07f
#include <math.h>
double x;
...
if (floor(x) == x && x != 0.0) { // x is an non-zero integer value
    int digits = floor(log10(fabs(x)+0.5)) + 1;
    printf("x is %.*f\n", digits, x);
}

将%g替换为%.10g以显示最多10个有效数字

我认为OP需要小数点后的位数,而不是数字的顺序。1+floor(log10(1.234+0.5))是1,不是(我想)想要的3。是的,我没有注意到Mike连续的mod操作是为了计算非整数值小数点后要打印多少位。我把重点放在Sean要求整数值不能有尾随数字或小数点的部分。你可以结合我们的两种方法来计算小数点前后的数字,以便计算所需的整体精度。是的,我就是这么想的。这非常不方便,因为格式字符串嵌入了较长的格式字符串中:>sprintf(buf,“%d%g”,myInt,myFloat);你是怎么包装的?>sprintf(buf,“%d%g”,myInt,包装器(myFloat));??包装器应该返回什么?或者更糟:>sprintf(buf,“%d%s”,myInt,Wrapper(myFloat));??这里有一个想法:写一篇我的短跑。检查您定义的令牌(如%y或其他什么),是否替换,并在下面调用sprintf,并将替换的字符串放在适当的位置。这样,您就拥有了我的sprintf(buf,“%d%y”,myInt,myFloat);您可以在my_sprintf中使用Mike Kale的技巧(%.*f),而不是传递实际的字符串。如果使用%.*f,则只需执行以下操作:sprintf(buf,“%d%.*f”、myint、getPlaces(myFloat)、myFloat);不需要包装器来生成格式字符串。