Как отформатировать числа с плавающей запятой с десятичной запятой с помощью библиотеки fmt? - PullRequest
10 голосов
/ 03 июля 2019

Я хочу использовать библиотеку fmt для форматирования чисел с плавающей запятой.

Я пытаюсь отформатировать число с плавающей запятой с десятичным разделителем ',' и безуспешно попытался:

#include <iostream>
#include <fmt/format.h>
#include <fmt/locale.h>

struct numpunct : std::numpunct<char> {
  protected:    
    char do_decimal_point() const override
    {
        return ',';
    }
};

int main(void) {
    std::locale loc;
    std::locale l(loc, new numpunct());
    std::cout << fmt::format(l, "{0:f}", 1.234567);
}

Вывод 1.234567.Я хотел бы 1,234567

Обновление:

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

Я только что открыл проблему в библиотеке fmt

1 Ответ

3 голосов
/ 03 июля 2019

Библиотека fmt приняла решение, что передача локали в качестве первого аргумента предназначена для перезаписи глобальной локали только для этого вызова. Он не применяется к аргументам со спецификатором формата f по проекту.

Для форматирования числа с плавающей запятой с использованием настроек локали необходимо использовать спецификатор формата n, например:

std::locale loc(std::locale(), new numpunct());
std::cout << fmt::format(loc, "{0:n}", 1.234567);

Спецификатор формата n поддерживает аргументы с плавающей запятой начиная с версии 1d3e3d .

...