【问题标题】:Print a sequence of numbers in PHP with the correct (+/-) sign在 PHP 中打印带有正确 (+/-) 符号的数字序列
【发布时间】:2026-01-18 15:40:01
【问题描述】:

我需要按顺序打印一些数字,它们之间有 + 和 - 。但是,我事先不知道哪个数字是正数,哪个是负数。目前,我这样回应他们:

echo "$a + $b + $c + $d + $e + $f";

假设$a$f 的值都是正数。我会得到类似的东西:5 + 10 + 12 + 18 + 9 + 7

但是,如果某些值是负数,我会得到类似5 + -10 + 12 + -18 + 9 + - 7 的信息。在这种情况下,理想的输出应该是5 - 10 + 12 - 18 + 9 - 7

请不要说我不想计算加法或减法的最终结果。我只想用正确的符号把它全部打印在网页上。

我可以通过编写 6 个嵌套的 if() 块来做到这一点,但这似乎需要做很多工作,而且每次都这样做很容易出错。有什么聪明的办法可以输出正确的符号。

【问题讨论】:

  • 如果第一个数字是负数应该是什么样子?

标签: php string-formatting


【解决方案1】:

最简单的方法是更正最终字符串中的运算符外观:

$s = '5 + -10 + 12 + -18 + 9 + - 7'; // result of interpolation or concatenation
$s = str_replace('+ -', '- ', $s);
// => "5 - 10 + 12 - 18 + 9 -  7"

如果这对你来说是可能的,这将是尽可能快的——没有循环(在 php 中),没有条件一次处理每个数字。如果您仍然循环,我会推荐@Phils 建议与array_reduce - 功能风格的php - 适应您的需求。

【讨论】:

  • 谢谢@Tom。这似乎是改变标志的最有效和最简单的方法。 :)
【解决方案2】:

需要像这样手动检查每个变量:

echo "$a " . ($b < 0 ? " - " . abs($b) : " + $b") . ($c < 0 ? " - " . abs($c) : " + $c") . ($d < 0 ? " - " . abs($d) : " + $d") . ($e < 0 ? " - " . abs($e) : " + $e") . ($f < 0 ? " - " . abs($f) : " + $f");

【讨论】:

  • 谢谢@Lovepreet。我一直在寻找其他方法来保持原始的 echo 语句简短而简单。您的方式仍然比使用 6 个不同的 if() 块好得多。 :)
【解决方案3】:

你可以使用php sprintf函数。

function formatNum($num){
    return sprintf("%+d",$num);
}

function formatNum($num) {
  $num = (int) $num; // or (float) if you'd rather
  return (($num >= 0) ? '+' : '-') . $num; // implicit cast back to string
}

更多详情请阅读:-http://php.net/manual/en/function.sprintf.php

【讨论】:

【解决方案4】:

试试这个

$a = 10;

$b=-20;

$text = $a." ".$b;

$text= str_replace(" ", "+", $text);

echo $text;

输出

10+-20

【讨论】:

    【解决方案5】:

    将数字放入数组并使用array_reduce 创建字符串

    $numbers = [5, -10, 12, -18, 9, -7];
    $first = array_shift($numbers);
    
    echo array_reduce($numbers, function($str, $num) {
        return $str . sprintf(' %s %d', $num < 0 ? '-' : '+', abs($num)); 
    }, $first);
    

    演示~https://eval.in/1034635

    这样您就可以处理任意数量的数字,而无需到处重复逻辑。

    【讨论】: