在具有数字 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)
如果您需要另外区分整数和浮点数,您将需要做更多...
我需要格式化包含各种数字数据字段的 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)
如果您需要另外区分整数和浮点数,您将需要做更多...