【发布时间】:2020-01-22 13:59:25
【问题描述】:
有没有一种优雅的方法可以将双精度数格式化为小数点前具有固定位数的字符串(用前导零填充),但只显示需要的小数并具有最大精度?
例如固定小数点前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,但它们似乎都没有提供对小数点之前位数的具体控制。控制这一点的标准方法是调整字段宽度和精度,但这似乎不能提供我们需要的粒度。
目前我们找到的最“优雅”的解决方案如下(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"
【问题讨论】:
标签: c++ string formatting fmt