c - printf:如何在小数点上对齐数字
问题描述
考虑有一组数字:
my @array = (
1.788139343e-007, 0.0547055073198, -0.703213036125,
-0.583665880391, -1.41198285298, +0.171879081676,
-0.58966025098, -86.0627173425, -0.84449797709,
3.49876623321e-005, 3.02660429162, -0.256948695361);
我想让小数点对齐在总宽度为 m 的第 n 列(可能 n=6 和 m=25)
如果使用%f
i 得到很好对齐的数字,但需要科学计数法的数字正在被破坏。using%g
将点后的精度参数解释为绝对精度,导致小数点后有不同的小数。由于大多数数字都在 (-10, 10) 范围内,我不想采用科学记数法%e
是否有任何我忽略的标志或格式属性(或组合)?
预期结果是:
foreach my $f (@array){
printf("[%+25.12g]$/", $f);
}
[ +1.788139343e-007 ]
[ +0.0547055073198 ]
[ -0.703213036125 ]
[ -0.583665880391 ]
[ -1.41198285298 ]
[ +0.0171879081676 ]
[ -0.58966025098 ]
[ -86.0627173425 ]
[ -0.84449797709 ]
[ +3.49876623321e-005 ]
[ +3.02660429162 ]
[ -0.256948695361 ]
甚至更好
[ +1.7881393430000e-007 ]
[ +0.0547055073198 ]
[ -0.7032130361250 ]
[ -0.5836658803910 ]
[ -1.4119828529800 ]
[ +0.0171879081676 ]
[ -0.5896602509800 ]
[ -86.0627173425000 ]
[ -0.8444979770900 ]
[ +3.4987662332100e-005 ]
[ +3.0266042916200 ]
[ -0.2569486953610 ]
(问题是关于 Perl 但s?printf
s 格式字符串相当独立,所以我还添加了C
标签)
解决方案
该[*]printf
功能允许您:
- 获取已写入多少字符,
- 添加一些填充。
因此,如果您知道点 ( ) 之前有多少字符d = sprintf(buf, "%.0f", ar[i]);
,则可以使用 ( ) 对齐点printf("[%*s %g", 4-d, "", ar[i]);
。
然后用同样的逻辑来对齐右括号:
#include <stdio.h>
int main()
{
double ar[] = {
1.788139343e-007, 0.0547055073198, -0.703213036125,
-0.583665880391, -1.41198285298, 0.171879081676,
-0.58966025098, -86.0627173425, -0.84449797709,
3.49876623321e-005, 3.02660429162, -0.256948695361};
for (int i = 0; i < 12; ++i)
{
/* buffer to count how much character are before the dot*/
char buf[64];
/* how much before the dot? */
int d = sprintf(buf, "%+.0lf", ar[i]);
/* write float with aligned dot and store second padding */
int e = printf("[%*s %+.15lg", 4-d, "", ar[i]);
printf("%*s]\n", 25-e, "");
}
return 0;
}
给出:
[ +1.788139343e-07 ]
[ +0.0547055073198 ]
[ -0.703213036125 ]
[ -0.583665880391 ]
[ -1.41198285298 ]
[ +0.171879081676 ]
[ -0.58966025098 ]
[ -86.0627173425 ]
[ -0.84449797709 ]
[ +3.49876623321e-05 ]
[ +3.02660429162 ]
[ -0.256948695361 ]
推荐阅读
- python - 被覆盖的变量究竟何时会被垃圾收集?
- python - python 在 for 循环中的效率非常低,还是只是我的代码?
- ruby-on-rails - 创建要删除的提取
- html - 无法在 Angular 中设置未定义的属性(当它被定义时)
- azure - 批量/批量更改 Azure 应用服务(Web 应用)上的 SSL 证书
- c++ - 在 C++20 中调试协程
- node.js - 如何为我的 Firestore 查询创建复合索引?
- python - 如何从 Flask 后端的 HTML 页面接收数组
- sql - 无法使用 varbinary 数据类型选择正确的数据
- java - 连接两个 if else 语句时如何修复错误?