【问题标题】:Summing string in php, converted to integer在php中求和字符串,转换为整数
【发布时间】:2013-02-18 17:58:35
【问题描述】:

尝试对一些哈希使用简单的“版本控制”系统,我执行以下操作:

$last_version = '009';
$increment = '001';

$result = $last_version + $increment;

var_dump($result);

我希望:string(010) 但我得到了int(10),在我跳入ifstr-pad 之前,我想知道是否有任何其他方法可以保存所需的格式?

【问题讨论】:

  • 之后需要将其转换为字符串。
  • 为什么不存储一个 int 然后格式化输出呢? $版本 = 1; $版本++; echo sprintf('%03d', $version)? As for your str/int, you're forcing PHP to cast those strings to ints since you're using +`,就是加法。
  • 没有理由期待字符串(010)。如果你想组合字符串,你会得到“009001”,否则,如果你想添加他们的数值,你会使用整数。从一个转换到另一个很容易,但只需尝试了解其中的差异,否则您将来可能会因为一些微不足道的事情而花费数小时寻找错误。

标签: php string integer sum


【解决方案1】:

使用+ 会自动将变量转换为适当的number 类型(在本例中为int,但是可以将不同的字符串格式转换为float)。

如果要保留所需的 0 左填充,可以使用 sprintf() 格式化结果,如下所示:

$result = sprintf('%03d', $last_version + $increment);

格式说明符 %03d 指定您想要一个长度为 3 的整数字符串 (d),并在左侧填充字符 0

更多关于 PHP 的 Type Juggling 逻辑的信息可以在PHP Documentation: Type Juggling找到

【讨论】:

  • 太棒了......它完成了工作,我不必结束使用str_pad
  • @w0rldart 顺便说一句……为什么讨厌str_padsprintf 在这里做同样的事情。
  • 是的,确实如此……只是我想看看是否有其他替代方法
【解决方案2】:
$last_version = '009';
$increment = '001';

$result = $last_version + $increment;

$result = (string) $result ;

var_dump($result) ;

当您尝试对字符串执行数学运算时,它们会被转换为适当的类型。在这种情况下为 int。但是你可以在上面的例子中将整数转换回字符串。

【讨论】:

  • 甚至在问题之前尝试过,我得到相同的输出:\
  • 最后,$resultstring(2) "10",而不是string(3) "010"
  • 但是,sprintf("%03d", $result) 在这种情况下是选项。
【解决方案3】:

您不能添加字符串(就这么简单)。这就是 PHP 将两个字符串隐式转换为整数的原因(这称为 dynamic typing)。

要格式化您的号码,您可以执行以下操作:

$last_version = '009';
$increment    = '001';

$result = $last_version + $increment; // = 10
$result = sprintf("%03d", $result) // = "010"

【讨论】:

    【解决方案4】:

    当您使用+ 时,PHP 会自动将字符串转换为整数,因此您会看到int(10 结果。您将无法以这种方式添加字符串。因此,最好的办法是将版本保持为整数和字符串填充,如下所示:

    $last_version = 9;
    $increment = 1; 
    $pad_length = 3;
    $pad_string = '0';
    
    $result = $last_version + increment; // or simply $last_version++; if increment will always be 1
    
    $string_result = str_pad((string)$result, $pad_length, $pad_string, STR_PAD_LEFT);
    

    【讨论】:

    • 我最终得到了一个与此类似的代码,但正如我所问的......我正在寻找一种方法来避免 str_pad 和更多代码行。
    • @w0rldart 您可以肯定地使用sprintf(),正如其他答案中所指出的那样,但这确实没有什么不同。这里的关键点是在 PHP 中不能像那样添加字符串。数学必须在整数和之后设置的字符串格式上完成。
    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多