在具有数字 sprintf 格式的未初始化 table 字段中替换文本字符串

Substituting text string in uninitialized table fields having numeric sprintf format

我需要格式化包含各种数字数据字段的 table 行。一些字段具有整数,而其他字段具有必须以固定精度格式化的实数。右对齐的数字可能用空格填充,其他用零填充。

显然 sprintf 是完成这项工作的完美工具。

然而,偶尔 table 字段未定义,为 NULL,n/a 等。在这种情况下,我通常必须打印 'NULL''undef' 或其他文本字符串。 (即使让它未初始化也会使 Perl 发出警告。)

仅仅插入文本字符串是不行的。除了发出警告外,sprintf of say '% 11.2' 不仅会发出警告“Argument "NULL" isn't numeric in sprintf at...”,还会打印零而不是文本字符串。

知道如何做我需要的吗?

您可以尝试使用 "%s" 格式和辅助子例程:例如:

use strict;
use warnings;

my $num = "N/A";

printf "%s\n", format_float( $num );

sub format_float {
    return ($_[0] eq "N/A") ? $_[0] : sprintf "%f", $_[0];
}

我建议您将 printf 与主要格式一起使用,该主要格式仅使用字符串字段 %s 以及一组条件表达式,return 可以使用 [=14] 格式的数字=] 如果值已定义,或者字符串 NULL 如果未定义

举个例子应该会更清楚

my ($f1, $f2, $f3) = ( 700/3, undef, 1/7 );

printf "%11s %11s %11s\n",
    defined $f1 ? sprintf('%.2f', $f1) : 'NULL',
    defined $f2 ? sprintf('%.2f', $f2) : 'NULL',
    defined $f3 ? sprintf('%.2f', $f3) : 'NULL';

输出

 233.33        NULL        0.14

如果您可以 99% 确定您需要处理的所有非数字 "values" 都 不会 在任何地方都有数字,这可能就是您想要的:

sprintf (($num =~ /\d/) ? "%11.2f" : "%s", $num)

如果您需要另外区分整数和浮点数,您将需要做更多...