【问题标题】:Format negative integer/double using sprintf使用 sprintf 格式化负整数/双精度
【发布时间】:2014-01-30 14:26:51
【问题描述】:

是否可以仅使用 sprintf (c++) 以在符号和值之间有空格的方式格式化负整数/双精度?

from this: -1234

to this: - 1234

编辑:它将进入一个字符数组。

【问题讨论】:

  • 纯粹出于好奇,你为什么要这种格式?某些国家/地区是否在数字前使用空格格式化负数?
  • 文档非常清楚你能做什么和不能做什么...cplusplus.com/reference/cstdio/printf
  • @Bojangles:我确实见过一些报告,其中正数和负数都有一个前导符号,并且符号对齐。
  • 我正在编写一种翻译器,它将现代 CNC 机器读取的 g 代码文件转换为旧机器可以读取的旧格式。这些旧机器读取这样的负值。

标签: c++ char string-formatting printf negative-number


【解决方案1】:

我意识到这不是问题,但因为它被标记为 C++:

std::ostringstream out;
out << std::internal << std::setw(6) << -1234;
std::string result = out.str();

【讨论】:

    【解决方案2】:

    sprintf? Not directly, no.

    您需要自己实现此逻辑(使用abs/fabs 和第二个sprintf 参数),或为使用此渲染布局的国家/地区使用适当的语言环境希望您的实现遵守它。

    使用 C++ 自己的 I/O 流可能会容易得多,因此请考虑切换到这些。

    【讨论】:

      【解决方案3】:

      试试这个:

      char large_evil_array[128];
      double my_var = -12.34;
      int my_int = -6589;
      int chars_formatted = 
          snprintf(large_evil_array, sizeof(large_evil_array),
                   "%c %5.2f %c %d\n",
                    (char)((my_var < 0) ? '-' : ' '),
                    (double)((my_var < 0) ? (my_var * -1.0) : my_var),
                    (char)((my_int < 0) ? '-' : ' '),
                    (int)((my_int < 0) ? (-1 * my_int) : my_int));
      

      如果您使用 C++ 流,您可以编写自己的格式化修饰符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多