【问题标题】:Just a question about str_replace只是一个关于 str_replace 的问题
【发布时间】:2009-10-10 21:23:07
【问题描述】:

我对 PHP 中的 str_replace 有疑问。当我这样做时:

$latdir = $latrichting.$Lat;

If (preg_match("/N /", $latdir)) {
    $Latcoorl = str_replace(" N ", "+",$latdir);
}
else {
    $Latcoorl = str_replace ("S ", "-",$latdir);
}

print_r($latdir);
print_r($Latcoorl);

print_r($latdir); 给出:N52.2702777778

print_r ($Latcoorl);给出:N52.270277777800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 P>

是的,它添加了很多零。有人可以仅仅为了好玩而解释这种行为吗?

print_r ($latrichting);

给的:N

print_r ($Lat);

这是一个奇怪的长数字。

所以你认为它可能不是 str_replace 命令?

【问题讨论】:

  • $latrichting$Lat的值是多少?
  • 感谢您的快速回复,您正在做一些事情 $Lat 被 $Lat = $latdeg + (($latmin + ($latsec/60))/60);一个数学计算,所以我想我必须在那里搜索。
  • 这看起来像浮点数精度问题。
  • 为什么,如果我可能会问,当你知道你将在下一步用 + 或 - 替换 N 和 S 时,你是否添加它,为什么你使用正则表达式而不仅仅是str_replace?
  • 顺便说一句,你最好使用var_dump 而不是print_r,因为它会打印变量的类型。这将帮助您了解 float 何时变为 string

标签: php string str-replace


【解决方案1】:
$latmin2 = bcdiv($latsec, 60, 20);
$latmin_total = $latmin + $latmin2;
$lat = bcdiv($latmin_total, 60, 20);

$latdir = array("N" => 1, "S" => -1);

$latcoorl = $latdir * $latdir[$latrichting];

新年快乐。

【讨论】:

  • 感谢您的快速响应,哇,你们的读者工作得真快。但由于 Ivan Nevostruev,我有更多信息。
  • 谁投了我的票,当我是唯一一个没有把提问者吹走并且实际上想到了一些创造性原因而不是躲在“需要更多信息”的旗帜后面的人时.blah blah blah”应该认为自己在所有三个方面都是懦夫。
  • 你从哪里得到$Lat
  • 安东尼,我会感谢你的努力(我说 +2 票),但问题是我不能给你,我需要 15 个代表,只有 5 个。你的回答非常值得如果其他任何方法都不起作用,请努力(请参阅最后一分钟的补充)
  • +1 用于简化从 N/S 到 +/- 的过程。在任何连接之前(或者,在这种情况下,在这种情况下,期间)任何连接之前,在 $latrichting 上执行此操作要简单得多。一个问题……“+”是必要的吗? – hlpiii 0 秒前
【解决方案2】:

您的字符串替换搜索字符串在“N”之前有一个空格,而转储的值看起来像 N:

但不确定它与所有的零有什么关系。

【讨论】:

  • @Anthony,这是一条评论 ;) 点不过。
  • +1 以补偿投反对票的业力打击。虽然我同意 Anthony 的观点,但我认为您的回答(或“评论”)不会对不赞成票应该 -imho- 暗示的理解状态有害。
  • 我不是讨厌西蒙,也不是想打鞭子,我只是想,如果我给出一个真诚的疯狂答案并被否决,那么答案就不会提供(无意冒犯)应该指出对问题的任何见解(即使它是正确的)。如果对此发表评论,我会投票赞成,因为我在想同样的事情。我宁愿成为唯一的答案,它很疯狂,被投票否决,然后被善意的、错误放置的 cmets 淹没。
  • +1 很好的观察,实际上从示例中看起来 preg_match() 总是评估为假。我认为 preg_match() 和 str_replace() 调用都没有做它们应该做的事情,因为有额外的空间。 Anthony 的解决方案稍微清理了这个过程,所以 OP 现在走上了正轨。
  • @Anthony 我将其添加为可能的答案而不是评论的原因是,在我发布时,我们没有更多关于 $latrichting 和 $Lat 来自何处的信息,所以str_replace 中的错误可能会影响结果。我只是诚实地说我不知道​​它会如何影响结果,同样由于缺乏上下文。
【解决方案3】:

在我的系统上这个代码片段:

<?php
$latdir = ':N52.2702777778';

If (preg_match("/N /", $latdir)) {
    $Latcoorl = str_replace(" N ", "+",$latdir);
    }
    else {
        $Latcoorl = str_replace ("S ", "-",$latdir);
        }

print_r($latdir);
print_r($Latcoorl);
?>

给出以下结果:

:N52.2702777778:N52.2702777778

我最好的猜测是,在这段代码之后你有一些东西会打印出一系列 0。

【讨论】:

  • 你的永远不会处理浮点数,字符串不会受到额外零的影响。我相信开头的冒号实际上并不存在,只是 OP 中的一种错字。 “给:某事”与“给:某事”
  • print_r($latdir); 给出:N52.2702777778 的原始假设视为真的我没有看到任何浮动问题:发布的代码仅适用于字符串,与 $latdir 的获取方式无关。同样没有冒号,最初的 N 字符可以防止强制浮动。如果我最初的假设是错误的......好吧,我们是开发人员,而不是通灵者;)
【解决方案4】:

我会怎么做;只是 Anthony 原始答案的一种变体,它将所有内容都保留为数字并且不会进入字符串模式。

$Latcoorl = ($latrichting == "N") ? ($Lat) : (-1 * $Lat);

【讨论】:

    【解决方案5】:

    您所做的字符串操作不会生成任何 0。 0 必须来自 $lat。你用 $lat 做了什么?有任何除法吗? PHP 将尝试在 $lat 中存储最准确的浮点数。这不是一个真正的问题,它是一个正确的行为。只需在显示时截断数字,或将其四舍五入。

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 2012-12-10
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多