我需要设计一个函数,使负数返回其本身,但是如果一个数字已经没有加号,则在数字前面添加“+
”标记。
例如:
Input Output
----------------
+1 +1
1 +1
-1 -1
它将仅获取数字输入。
function formatNum($num)
{
# something here..perhaps a regex?
}
这个函数将在echo/print
中被调用多次,所以速度越快越好。
我需要设计一个函数,使负数返回其本身,但是如果一个数字已经没有加号,则在数字前面添加“+
”标记。
例如:
Input Output
----------------
+1 +1
1 +1
-1 -1
它将仅获取数字输入。
function formatNum($num)
{
# something here..perhaps a regex?
}
这个函数将在echo/print
中被调用多次,所以速度越快越好。
你可以使用正则表达式:
function formatNum($num){
return preg_replace('/^(\d+)$/',"+$1",$num);
}
但是我建议不要使用正则表达式来处理这么简单的事情。最好使用sprintf函数,如下所示:
function formatNum($num){
return sprintf("%+d",$num);
}
一个可选的符号说明符,可以强制在数字上使用符号(-或+)。默认情况下,仅当数字为负数时才使用-号。 此说明符可以强制使正数附带+符号,并且是在PHP 4.3.0中添加的。
sprintf
(我想知道为什么一开始没有人建议使用它 ;),但你比我快 :-D) - Felix Klingsprintf
,这个解答获得了+1的评价。但在一个好的回答前面(似乎是随机地?)加上正则表达式的解决方案,则获得了-1的评价。 - salathefunction formatNum($num) {
return ((float) $num>0)?'+'.$num:$num;
}
sprintf
做了正确的事情,你可能需要重新考虑你的答案。 - Wolffunction formatNum($num) {
$num = (int) $num; // or (float) if you'd rather
return (($num >= 0) ? '+' : '') . $num; // implicit cast back to string
}
>= 0
测试正数,并在其为真时添加 +
)。你能详细说明你在哪里看到了错误的比较运算符吗? - pinkgothicsprintf
一样处理,那么您的函数是正确的。不幸的是,OP选择了一个模糊的示例集。因此,我们现在有两个答案,不同的结果都是正确的。在问题中要求格式化非负数或添加+0
会更好,但这显然不是您的错。由于您正在正确处理现有的符号,因此应该优先选择您的方法而不是Dan的方法。 - Wolf试试这个:
$fmt = new NumberFormatter('es_ES', NumberFormatter::DECIMAL);
$fmt->setTextAttribute(NumberFormatter::POSITIVE_PREFIX, '+');
$result = $fmt->format(10000);
结果将是:+10.000
NumberFormatter::POSITIVE_SUFFIX
正好起作用,您将收到10.000+
$num1=2;
$num2=-2;
printf("%+d",$num1);
echo '<br>';
printf("%+d",$num2);
输出结果
+2
-2
function formatNum($num){
return printf("%+d",$num);
}
sprintf("%+d",$num);
代替0
输出+02
。 - Tim Visée@unicornaddict 提供的 sprintf
解决方案非常好,可能是最优雅的方法。我只是想提供另一种选择。不确定它们在速度上如何比较。
// Non float safe version
function formatNum($num) {
return (abs($num) == $num ? '+' : '') . intval($num);
}
// Float safe version
function formatNum($num) {
return
(abs($num) == $num ? '+' : '')
. (intval($num) == $num ? intval($num) : floatval($num));
}
// Float safe version, alternative
function formatNum($num) {
return
(abs($num) == $num ? '+' : '')
// Add '1' to $num to implicitly cast it to a number
. (is_float($num + 1) ? floatval($num) : intval($num));
}
intval()
,不如只使用return (((string)abs($num)) === $num) ? '+' . $num : $num;
- 尽管这可能仅适用于整数?[我有点偏执,天哪。] - pinkgothicsprintf
是更好的选择。 - nikc.orgsprintf
的观点!不过我不确定将其修改为适用于浮点数是否容易,因为字符串可能无法表示为可以存储为浮点数的浮点数,然后从浮点数转换回字符串会产生一个本来不存在的差异? - pinkgothicsprintf
的又一个优点。)但对于你所举的精度,测试你的需求证明了它的重要性。特别是如果依赖于 int
强制转换。 (你指出 is_float
的不合逻辑(关于 PHP 的非严格类型)缺陷是正确的,请参见修订版。) - nikc.org好的,这可能有点老旧且无用,但我认为仍然有一些空间可以稍作添加。如果您已经有了“数字”:
if($num>=0) $num='+'.(0+$num);
或者,如果您确定它是一个数字:
if($num>=0) $num='+'.$num;
对于负数不起作用,如果是正数则转换为字符串。
添加0会将其转换为数字(如果它不是数字),并且不会更改数字类型,例如强制转换为(float)或(int)。如果您确定它是数字,则此方法无用,请使用第二个版本。
这可能是最快的方法。
缺点是一半结果为字符串,一半为数字(sprintf将使它们全部成为字符串)。
0
视为正数吗? - Wolf