Php 存储为字符串的数字的反向符号

Php 存储为字符串的数字的反向符号,php,Php,这是一个微不足道的操作,但它揭示了一些棘手的问题。 我有一个PHP字符串,比如说'234.00'。我想把它转换成一个负数,最好在最后得到一个字符串。所以测试用例应该是 原来的代码是 $signReversed = $stringNumber * -1.0 但这有问题,因为我确实需要一个字符串来与其他代码保持一致。所以我试过了 $signReversed = strval($stringNumber * -1.0) 但这在最后一个测试用例中失败,因为我得到'-0'--负零作为字符串 关于最佳方

这是一个微不足道的操作,但它揭示了一些棘手的问题。 我有一个PHP字符串,比如说
'234.00'
。我想把它转换成一个负数,最好在最后得到一个字符串。所以测试用例应该是

原来的代码是

$signReversed = $stringNumber * -1.0
但这有问题,因为我确实需要一个字符串来与其他代码保持一致。所以我试过了

$signReversed = strval($stringNumber * -1.0)
但这在最后一个测试用例中失败,因为我得到
'-0'
--负零作为字符串

关于最佳方法的建议

试试看:

$stringVal = "234.00";
$negativeStringVal = strval(floatval($stringVal) * -1);
我认为您的问题在于PHP试图将您的数字转换为
int
,但由于小数而失败

编辑:PHP Fiddle:

尝试一下:

$stringVal = "234.00";
$negativeStringVal = strval(floatval($stringVal) * -1);
我认为您的问题在于PHP试图将您的数字转换为
int
,但由于小数而失败


编辑:PHP Fiddle:

为什么不使用一元否定运算符(-)


为什么不直接使用一元否定运算符(-)


也许是这样的

$vals=array('234.00','-234.00','0');
$newvals=array();
foreach($vals as $val){
    $tmpval=$val*-1;
    array_push($newvals,"$tmpval");
}
var_export($newvals);

也许是这样的

$vals=array('234.00','-234.00','0');
$newvals=array();
foreach($vals as $val){
    $tmpval=$val*-1;
    array_push($newvals,"$tmpval");
}
var_export($newvals);

试一试
$signReversed=strval(floatval($stringNumber)*-1.0)

试一试
$signReversed=strval(floatval($stringNumber)*-1.0)

这怎么办

应该适用于小数字,大数字和字符串可以包含空字节

function flipSign($stringNummer) {
   if ((string)$stringNummer !== $stringNummer) // fast !is_string check
      throw new Exception('input should be a string');
   return number_format($stringNummer * -1, 2, '.', '');
}

/**
 * NULL byte test 
 */
var_dump(flipSign("00\0.10"));   // string(5) "-0.10" 
var_dump(flipSign("-00\0.10"));  // string(4) "0.10"

var_dump(flipSign("00.10"));   // string(5) "-0.10" 
var_dump(flipSign("-00.10"));  // string(4) "0.10"

var_dump(flipSign("234.00"));   // string(7) "-234.00 
var_dump(flipSign("-234.00"));  // string(6) "234.00"

var_dump(flipSign("234.20"));   // string(7) "-234.20"
var_dump(flipSign("-234.20"));  // string(6) "234.20" 

var_dump(flipSign("100000.20"));   // string(10) "-100000.20"
var_dump(flipSign("-100000.20"));  // string(9)  "100000.20"
这个怎么样

应该适用于小数字,大数字和字符串可以包含空字节

function flipSign($stringNummer) {
   if ((string)$stringNummer !== $stringNummer) // fast !is_string check
      throw new Exception('input should be a string');
   return number_format($stringNummer * -1, 2, '.', '');
}

/**
 * NULL byte test 
 */
var_dump(flipSign("00\0.10"));   // string(5) "-0.10" 
var_dump(flipSign("-00\0.10"));  // string(4) "0.10"

var_dump(flipSign("00.10"));   // string(5) "-0.10" 
var_dump(flipSign("-00.10"));  // string(4) "0.10"

var_dump(flipSign("234.00"));   // string(7) "-234.00 
var_dump(flipSign("-234.00"));  // string(6) "234.00"

var_dump(flipSign("234.20"));   // string(7) "-234.20"
var_dump(flipSign("-234.20"));  // string(6) "234.20" 

var_dump(flipSign("100000.20"));   // string(10) "-100000.20"
var_dump(flipSign("-100000.20"));  // string(9)  "100000.20"


这返回一个数字,显然不是字符串。更新了代码片段以将数字转换为字符串。向上投票,但我将使用Raymond的
number\u格式…
答案,因为它更适用于我在原始问题中忽略的一些其他测试用例。这显然返回了一个数字,不是字符串。更新了代码片段以将数字转换为字符串。向上投票,但我将使用Raymond提供的
number\u格式…
答案,因为它适用于一些我忽略了在原始问题中添加的其他测试用例。$number=“-”$数量;使用它,它将始终是一个字符串,无需转换任何内容。只需添加1个检查($number==“-0”)$number=“0”;。把它放在一个不适用于-234.00.Boo反对票的函数中,没有任何评论。看起来太简单或琐碎,我猜?这个问题对我来说仍然是合理的,我收到了多个错误的答案,所以它不是非常简单。使用substr表示-234.00,substr(“-234.00”,1);我认为这太复杂了,必须先检查字符串是否为负或正,然后仅在为负时执行子字符串。$number=“-”$数量;使用它,它将始终是一个字符串,无需转换任何内容。只需添加1个检查($number==“-0”)$number=“0”;。把它放在一个不适用于-234.00.Boo反对票的函数中,没有任何评论。看起来太简单或琐碎,我猜?这个问题对我来说仍然是合理的,我收到了多个错误的答案,所以它不是非常简单。使用substr表示-234.00,substr(“-234.00”,1);我认为这太复杂了,必须先检查字符串是否为负或正,然后仅在为负时才执行子字符串;在234.之后终止字符串的空字节。。我发布了一个答案,其中修复了“.”之后的截断零。零测试失败——仍然返回负零。为什么不测试数字是否为零,然后在这种情况下不进行乘法?因为我需要一条一行线。:-)php代码也以$stringVal=“234\0.00”开头;在234.之后终止字符串的空字节。。我发布了一个答案,其中修复了“.”之后的截断零。零测试失败——仍然返回负零。为什么不测试数字是否为零,然后在这种情况下不进行乘法?因为我需要一条一行线。:-)在零测试中失败--仍然返回负零。在零测试中失败--仍然返回负零。因此,您答案的主要部分是
$val*-1
,这正是我在开始时得到的。它在
0
案例中失败。因此,您的答案的主要部分是
$val*-1
,这正是我开始时的答案。它在
0
情况下失败。完美,尽管我可以保证输入不是字符串,所以我可以跳过第一部分。完美,尽管我可以保证输入不是字符串,所以我可以跳过第一部分。