我正在生成一个用作FORTRAN输入文件的文本文件。FORTRAN程序指定它读取的值的格式必须
1.0
必须打印为
0.1000000E+01
到目前为止,我使用iostream最接近的是
1.000000E+00
使用代码
cout << setprecision(6) << fixed << scientific << uppercase;
_set_output_format(_TWO_DIGIT_EXPONENT);
cout << 1.0 << endl;
有没有人知道如上图所示获得前导零的最佳方法,最好是使用ostream而不是printf?
正如我所说,你的要求是不标准的,但你可以通过一个技巧来实现:
#include <iostream>
#include <iomanip>
#include <cmath>
class Double {
public:
Double(double x): value(x) {}
const double value;
};
std::ostream & operator<< (std::ostream & stream, const Double & x) {
// So that the log does not scream
if (x.value == 0.) {
stream << 0.0;
return stream;
}
int exponent = floor(log10(std::abs(x.value)));
double base = x.value / pow(10, exponent);
// Transform here
base /= 10;
exponent += 1;
stream << base << 'E' << exponent; // Change the format as needed
return stream;
}
int main() {
// Use it like this
std::cout << std::setprecision(6) << std::fixed;
std::cout << Double(-2.203e-15) << std::endl;
return 0;
}
需要double
包装,因为您无法为double
重新定义<<
。
我没有测试将exponent
和base
分开方式,以对抗浮点的可能性,也许您可以提出更好的替代方案,但您得到了这样的想法:)
丙吉心想:
不是一个很好的答案,因为C++答案优先。
char buf[20];
buf[0] = ' ';
double x = -1.234567;
sprintf(&buf[1], "% .6E", x*10);
if (buf[3] == '.') { // detect if x was INF or NAN
buf[0] = buf[1];
buf[1] = '0';
buf[3] = buf[2];
buf[2] = '.';
}
// Cope with leading potential space if needed
if (buf[0] == ' ') memmove(&buf[0], &buf[1], strlen(buf));
printf("%s\n", buf);
// -0.1234567E+00
缺点:如果小数点不是‘就麻烦了。’或x靠近inf。