Существует ли элегантный способ форматирования двойного числа в виде строки с фиксированным количеством цифр перед десятичной запятой (с добавлением начальных нулей), но с отображением десятичных знаков только необходимого и с максимальной точностью?
Например, с фиксированными 3 цифрами до и до 2 цифр после десятичной точки:
// desired:
1.00000 -> "001"
1.10000 -> "001.1"
1.12345 -> "001.12"
// not:
1.10000 -> "0001.1" // too many leading zeroes
1.12345 -> "1.1235" // too few leading zeroes, too many digits after the decimal point
Дополнительные ограничения:
- Десятичные дроби должны быть фактически округлены, а не дополненные пробелами
- Отрицательные числа не имеют значения, они отфильтровываются до этой точки
- Вход находится в диапазоне [0,0, 180,0]
Мы рассматривал функции printf, stringstream, boost :: format и fmtlib , но ни один из них, похоже, не предлагает конкретных c элементов управления количеством цифр до десятичной точки. Стандартный способ контролировать это - регулировать ширину и точность поля, но кажется, что это не дает необходимой нам степени детализации.
Наиболее «элегантное» решение, которое мы до сих пор нашли, это следующее (где 123.1f
- это входное значение):
boost::trim_right_copy_if(fmt::format("{:06.2f}", 123.1f), boost::is_any_of("0"))
Но я не могу не думать, что для этого должно быть более элегантное / надежное решение.
Для контекста мы иметь GUI, который отображает координаты широты / долготы. Наш клиент попросил нас заполнить ведущими нулями, но максимально уменьшить цифры. Это компромисс между сокращением ненужной информации и предотвращением путаницы в максимально возможной степени. например:
W135°2'2.3344" -> W135°02'02.33"
W135°22.3344" -> W135°00'22.33"
W135°2'3" -> W135°02'03"
W135°22'2.999" -> W135°22'03"
W1°35" -> W001°00'35"
W1°35' -> W001°35'00"