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);不需要包装器来生成格式字符串。