C/C++ sprintf formatting -0
C/C++ sprintf formatting -0
曾经有一个小函数
string format_dollars_for_screen(float d)
{
char ch[50];
sprintf(ch,"%1.2f",d);
return ch;
}
谁喜欢返回-0.00
我将它修改为
string format_dollars_for_screen(float d)
{
char ch[50];
float value;
sprintf(ch,"%1.2f",d);
value = stof(ch);
if(value==0.0f) sprintf(ch,"0.00");
return ch;
}
并且它开始按预期返回0.00
。我的问题是,为什么另一个解决方案不起作用?
string format_dollars_for_screen(float d)
{
char ch[50];
float value;
sprintf(ch,"%1.2f",d);
value = stof(ch);
if(value==0.0f) sprintf(ch,"%1.2f", value);
return ch;
}
和/或有更有效的方法来做到这一点?这只是我的想法,所以欢迎批评。div =)
浮点数都有+ 0和- 0。它们与==
运算符比较相等,但在其他算术表达式中产生不同的结果:1/+0 == +inf
和1/-0 == -inf
。
对于您的情况,您不应该使用浮点数表示货币数量。而是使用整数来计算美分(或其他十进制分数),并相应地格式化它们:
string format_dollars_for_screen(int cents)
{
bool neg = cents < 0;
if(neg) cents = -cents;
char ch[50];
sprintf(ch, "%s%d.%.2d", "-"+!neg, cents/100, cents%100);
return ch;
}
相关文章:
- 使用 sprintf 将十六进制0xAABBCC转换为字符串"AA:BB:CC"
- 高精度双精度的 Sprintf 格式化问题
- sprintf(b, "%" ) 是否定义了?
- C++ cout formatting
- 使用 sprintf 追加到字符数组
- redefine printf(), sprintf(), etc. arm-none-eabi toolchain
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- C++我应该用什么来保存格式化为字符串变量(如sprintf())的文件
- 有没有办法自动实现 sprintf 的缓冲区分配?
- 在 sprintf 中从 'signed char*' 到 'char*' 的转换无效
- 需要将 sprintf 格式加倍并返回太长的字符串
- 代码中的"sprintf"用法是否需要释放内存?
- 使用 sprintf 和 sscanf 将给定数字中的所有 0 替换为 5
- sprintf() 正在添加一个额外的变量
- 对 sprintf 可变参数使用一个指针
- 如何使用sprintf将UINT_64的数组添加到一个字符数组中
- 在 sprintf 函数中添加逗号
- 定义char数据类型,并与sprintf一起使用
- 如何在C++03中用sprintf正确地替换sprintf_s
- C/C++ sprintf formatting -0