使用 sprintf 根据字母宽度对齐

Posted

技术标签:

【中文标题】使用 sprintf 根据字母宽度对齐【英文标题】:Aligning based on the width of letters with sprintf 【发布时间】:2012-02-06 20:21:01 【问题描述】:

我正在尝试为电子邮件对齐基于文本的项目列表。基本上我遇到的问题是它只适用于固定宽度(等宽)字体 - 我想要一个脚本,它可以根据标准 Arialish 字体中每个字母的宽度以某种方式对齐它。

function sprintf_nbsp() 
   $args = func_get_args();
   return str_replace(' ', ' ', vsprintf(array_shift($args), array_values($args)));

$format = '%-6s%-\'.35.35s...%\'.10s<br>';
$str = sprintf_nbsp($format, '1', 'A list of items - this is the first', '$49.99');
$str .= sprintf_nbsp($format, '100', 'This is something else', '$4.99');
$str .= sprintf_nbsp($format, '5', 'A book', '$499.99');
$str .= sprintf_nbsp($format, '16', 'Testing the function', '$49.99');
echo '<div style="font-family:Courier">'.$str."</div>";
echo '<br><br>'.$str;

(sprintf_nbsp() 可能不是必需的,我只是在 php 论坛上找到的,我对其他解决方案持开放态度)

【问题讨论】:

您无法在 PHP 中执行此操作,因为您无法确定 PHP 中每个字母的宽度 - 您需要 CSS 样式或等宽字体来实现所需的输出。 那么你建议我如何处理这个问题? 【参考方案1】:

固定宽度(等宽)字体 - 我想要一个能够以某种方式实现的脚本 根据标准 Arialish 中每个字母的宽度对齐它 字体。

简单地说,这是不可能的。

对于固定-width字体,每个字符都具有相同的宽度,因此名称为固定宽度。

对于其他字体,情况并非如此。例如,您可以清楚地看到iM 窄得多。

您无法知道用户使用哪种字体,即使您指定了类似font-family: Arial 之类的内容,这可能并不总是有效,不同的系统(OSX、X11 等)使用不同的字体,并且一些用户还会覆盖字体网站的设置等

即使如果你知道 100% 确定用户使用哪种字体,几乎不可能将所有内容对齐到像素完美。

因此,您有两个选择:要么使用固定宽度的字体(“Consolas”是一种看起来相当不错的标准 Windows 字体),要么使用不同的布局。

你可能想要的是这样的:

<style>
  span  display: block; width: 20em;
</style>

<span>Some text</span>
<span>Hello, world!</span>
<span>A swallow could not carry a coconut</span>

在这里,每个 &lt;span&gt; 的宽度相同 (20em),无论它包含多少文本。

使用空格来对齐内容几乎总是是个坏主意。使用 CSS 不仅更简洁,而且更容易。

【讨论】:

以上是关于使用 sprintf 根据字母宽度对齐的主要内容,如果未能解决你的问题,请参考以下文章

c语言中sprint函数怎么使用?

C语言中的sprint函数问题

如何解压字符串 - 使用 sprintf 创建 - 在 Perl 中具有固定宽度

在 stm32f7 上使用 freeRTOS 的 sprint/printf 问题

python对齐输出使三个数字空格

如何在Linux中对齐包含不同分隔符的文本文件的不同部分? [关闭]