Невозможно отформатировать два числа с плавающей запятой в одну строку, используя библиотеку {fmt} - PullRequest
1 голос
/ 31 марта 2020

Я только начинаю использовать библиотеку {fmt} в своем приложении и обнаружил, что не могу использовать библиотеку для форматирования двух чисел с разным количеством цифр, так как происходит сбой программы.

После некоторых экспериментов Я понял, что на самом деле все немного хуже, так как я не могу отформатировать что-нибудь после того, как отформатирую любое число с плавающей запятой с помощью {0:.0f} (или 0:.2f, если на то пошло).

Пример кода ведет себя мне нелогично:

#include <fmt\core.h>
#include <iostream>

int main()
{
    std::cout << fmt::format("{} , {}\n", 3.14, 10.0); // Prints out '3.14, 10.0'
    //std::cout << fmt::format("{0:.0f} , {}\n", 3.14, 10.0); // - ERROR: fmt::v6::format_error at memory location 
    std::cout << fmt::format("{0:.0f} , {0:.0f}\n", 3.14, 10.0); // - WRONG RESULT: Prints out '3, 3'
    std::cout << fmt::format("{0:.0f} , {:d}\n", 3.14, 10); // ERROR: fmt::v6::format_error at memory location

    //std::cout << fmt::format("{:s}, {:s}", fmt::format("{0:.2f}", 3.14), fmt::format("{:0:.1f}", 10.0)); // EVEN THIS DOESN'T WORK

    // This is the only way I found of getting the output I want:
    std::string a = fmt::format("{0:.2f}", 3.14);
    std::string b = fmt::format("{0:.1f}", 10.0);

    std::cout << fmt::format("{:s}, {:s}", a, b);

    return 0;
}

1 Ответ

3 голосов
/ 31 марта 2020

Числа перед : используются для подсчета аргументов.
0: является первым, 1: вторым ...
Если вы ничего не поставите перед :, тогда аргументы будет рассмотрено по порядку.
Нельзя смешивать в одной строке формата некоторые {} со счетчиком аргументов, а другие без такого счетчика аргументов.

...