Сообщение 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
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
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;
}