Информация об изменениях

Сообщение Re: Вариант №2 (постпроцессинг строк) от 11.09.2019 7:27

Изменено 11.09.2019 7:41 rg45

Re: Вариант №2 (постпроцессинг строк)
Здравствуйте, Went, Вы писали:

W>Доброго дня. Простите за ламерский вопрос, но все же

W>Мне нужно превратить стандартными средствами float в строку, чтобы соблюдались следующие условия:
W>1. Лишние нули не пишутся, лишняя точка тоже. 1.1000f -> "1.1", 4f -> "4"
W>2. Точность не больше двух знаков после запятой. 1.234 -> "1.23".
W>Все!
W>В С-шном формате есть %f и %g, но я нашел комбинации флагов, дающей нужного результата. Первый постоянно дописывает ненужные нули, даже если они не нужны, второе переводит в экспоненциальный формат, если число очень близко к нулю.
W>С++-ные варианты выдают подмножество С-шных, которые не устраивают.

Вот другой подход к решению задачи: сформировать строку страндартными средствами, затем отбросить лишние нули. Косяки с потерей точности тоже можно поймать, но это косяки уже не мои

https://ideone.com/2iDTT4

std::string format(double x, int precision = 2)
{
    std::ostringstream output;
    output << std::fixed << std::setprecision(precision) << x;
    std::string s = output.str();

    if (precision > 0)
    {
        const auto pos = s.find_last_not_of('0');
        if (pos != s.size() - 1)
        {
            const auto count = s[pos] != '.' ? pos + 1 : pos;
            return s.substr(0, count);
        }
    }
    return s;
}
Re: Вариант №2 (постпроцессинг строк)
Здравствуйте, Went, Вы писали:

W>Доброго дня. Простите за ламерский вопрос, но все же

W>Мне нужно превратить стандартными средствами float в строку, чтобы соблюдались следующие условия:
W>1. Лишние нули не пишутся, лишняя точка тоже. 1.1000f -> "1.1", 4f -> "4"
W>2. Точность не больше двух знаков после запятой. 1.234 -> "1.23".
W>Все!
W>В С-шном формате есть %f и %g, но я нашел комбинации флагов, дающей нужного результата. Первый постоянно дописывает ненужные нули, даже если они не нужны, второе переводит в экспоненциальный формат, если число очень близко к нулю.
W>С++-ные варианты выдают подмножество С-шных, которые не устраивают.

Вот другой подход к решению задачи: сформировать строку страндартными средствами, затем отбросить лишние нули. Косяки с потерей точности тоже можно поймать, но это косяки уже не мои

https://ideone.com/2iDTT4

std::string format(double x, int precision = 2)
{
    std::ostringstream output;
    output << std::fixed << std::setprecision(precision) << x;
    std::string s = output.str();

    if (precision > 0)
    {
        const auto pos = s.find_last_not_of('0');
        assert(pos != std::string::npos);        

        if (pos != s.size() - 1)
        {
            const auto count = s[pos] != '.' ? pos + 1 : pos;
            return s.substr(0, count);
        }
    }
    return s;
}