当前位置: 首页 > 知识库问答 >
问题:

用C++打印带一个前导零的指数符号

潘振国
2023-03-14

我正在生成一个用作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?

共有2个答案

商正诚
2023-03-14

丙吉心想:

不是一个很好的答案,因为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。

谷德本
2023-03-14

正如我所说,你的要求是不标准的,但你可以通过一个技巧来实现:

#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重新定义<<

我没有测试将exponentbase分开方式,以对抗浮点的可能性,也许您可以提出更好的替代方案,但您得到了这样的想法:)

 类似资料:
  • 问题内容: 尝试使用格式说明符来打印浮点数,该浮点数将小于1,且前导零。我想出了一点技巧,但我认为有一种方法可以将格式说明符中的前导零丢弃。我在文档中找不到它。 问题 哈克 问题答案: 尽管我喜欢可爱的正则表达式技巧,但我认为简单的函数是实现此目的的最佳方法: 这样做的好处是易于理解,部分原因是因为它是简单的字符串匹配而不是正则表达式。

  • 我还没有找到一个能解决PHP中整数到字符串转换这一方面的问题,所以 我有一个文件,其中一个字段包含一些长度为3、4或5位的数字,我需要将所有数字标准化为4位 如果数字是123、1234、12345,那么为了标准化,我在第一个数字后面加了一个零,第二个数字不加任何处理,第三个数字四舍五入:到目前为止还不错。问题在于,该文件包含一些具有有效前导零023、0234、02346的数字 我需要保留前导零,我

  • 问题内容: 我需要存储Medicare APC代码。 我相信格式需要4个数字。前导零是相关的。有什么方法可以通过验证存储此数据类型?我应该如何存储这些数据(varchar(4),int)? 问题答案: (可选)您仍然可以添加检查约束,以确保数据为带前导零的数字。本示例将在Oracle中引发异常。在其他RDBMS中,可以使用正则表达式检查:

  • 问题内容: 给定以下示例: 输出为: 为什么? 问题答案: 这是因为前导零的整数文字是八进制整数(以8为底):

  • 这是用C++语言编写的代码。 为什么在第一个cout语句中,程序尝试打印直到它找到一个空字符,而在第二个语句中,它只打印一个字符?

  • 我正在开发一个文本编辑器,我的下一个目标是在打印机上打印书面文本(而不是sysout)。 我试了很多次,它起作用了,但是换行符被忽略了。 我创建了一个新的图形并设置了字体。然后我把写在编辑器窗口中的文本。iPosX 你们有什么想法,我可以打印整个字符串考虑到行中断? 提前感谢!