【问题标题】:In Php, how to get float value from a mixed string?在 PHP 中,如何从混合字符串中获取浮点值?
【发布时间】:2014-06-21 13:23:03
【问题描述】:

我得到了一个类似的字符串:

$str = "CASH55.35inMyPocket";

我只想获得 55.35。

我试过了:

$str = floatval("CASH55.35inMyPocket");
if ($str > 0) {
    echo "Greater_Zero";
} else {
    echo "LessZERO!!";
}
// echo "LessZERO!!";

我也试过了:

$str = (float)"CASH55.35inMyPocket";
if ($str > 0) {
    echo "Greater_Zero";
} else {
    echo "LessZERO!!";
}
// echo "LessZERO!!";

根据文档:

字符串很可能会返回0,尽管这取决于 字符串最左边的字符。

所以,flotval 和 (float) 显然只有在字符串类似于以下内容时才有效: 55.35aAbBcCdDeEfF... 但如果是这样就不会工作:aAbBcC55.35dDeEfF

有没有办法获得浮动无论文本的位置如何?

【问题讨论】:

标签: php string


【解决方案1】:

如果你不想使用正则表达式,请使用filter_var:

$str = "CASH55.35inMyPocket";
var_dump( (float) filter_var( $str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) ); // float(55.35) 

【讨论】:

  • 感谢(float)...没有它,返回值是一个字符串
  • 请您解释一下"FILTER_FLAG_ALLOW_FRACTION" 部分吗?....似乎无法理解为什么除了单独拥有"FILTER_SANITIZE_NUMBER_FLOAT" 之外还需要它.... thx
  • FILTER_FLAG_ALLOW_FRACTION 是我想要的。谢谢
  • @UniversalGrasp 此标志允许小数点后有数字。如果没有标志,它将删除.并在这种情况下显示5535
【解决方案2】:

您所拥有的不能转换为浮点数,因为从 PHP 的角度来看,它看起来不像浮点数。不过可以使用正则表达式获取值。

如果您不确定是否总是会有小数。无论文本中的位置如何,您都试图获取数字(根据您的问题)。你可以使用:

^.*?([\d]+(?:\.[\d]+)?).*?$

从以下字符串中获取数值:

CASH55.35inMyPocket
CASH55inMyPocket
55.35inMyPocket
55inMyPocket
inMyPocket55.35
inMyPocket55

解释:http://regex101.com/r/tM8eM0
演示:http://rubular.com/r/Gw5HTzsejj
PHP 演示:https://eval.in/165521

基本上它在字符串中查找数字。并且它还可以选择在此之后检查小数。

【讨论】:

  • 这可能是世界上最快的方式吗?
  • 在性能方面。与其他答案相比,您的答案似乎更短,只是想知道它是否也更快...... thx
  • 不知道是不是更快。除非您在整个请求过程中这样做成千上万次,否则我也不在乎
【解决方案3】:

在使用floatval 或(float) 之前,您可以尝试一些函数来为您提取该值。

类似:

function myFloats($str) {

  if(preg_match("#([0-9\.]+)#", $str, $match)) { // search for number that may contain '.'
    return floatval($match[0]);
  } else {
    return floatval($str); // take some last chances with floatval
  }
}

然后测试:

echo myFloats("CASH55.35inMyPocket");

【讨论】:

  • 这也将匹配 3.3.3 或 ...
  • 答案非常适合:CASH55.35inMyPocket
  • @ErickBest 这样的回答——尤其是你的防御性评论——可能会让你失去你的“梦想工作”,因为招聘人员会抽样 Stack。您可能会被贴上这样的烙印:缺乏想象力的程序员、无法预测现实生活场景、编写严格的代码等;)
【解决方案4】:

我认为preg_replace 在这里可能会有所帮助(未经测试):

$float = preg_replace('/[^0-9\.]/', "", "CASH55.35inMyPocket"); // only show the numbers and dots

您可以将 preg 再扩展一点,只得到 [number].[number],但在这种情况下,我认为它会起作用。

【讨论】:

  • 如果是 .CASH55.35inMyPocket => .55.35 则无济于事
  • 注意:如果您将字符串更改为:“CASH.55.35inMyPocket”或“.CASH55.35inMyPocket”(请参阅​​前导点)并且此解决方案失败。
【解决方案5】:

使用正则表达式:

preg_match('/([0-9]+\.[0-9]+)/', 'CASH55.35inMyPocket', $matches);
$number = (float) $matches[1]; // 55.35

【讨论】:

    【解决方案6】:

    修改@hek2mgl 答案以获得浮点数和整数

    preg_match('/([0-9]+\.?[0-9].)/', 'CASH55.35inMyPocket', $matches);
    $number = (float) $matches[1]; // 55.35
    
    preg_match('/([0-9]+\.?[0-9].)/', 'CASH55inMyPocket', $matches);
    $number = (float) $matches[1]; // 55
    
    preg_match('/([0-9]+\.?[0-9].)/', 'Total.CASH55.35inMyPocket', $matches);  //with a dot before number
    $number = (float) $matches[1]; // 55.35
    

    【讨论】:

      【解决方案7】:
      function extract_numbers($string)
      {
      preg_match_all('/([\d]+)/', $string, $match);
      return $match[0];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 2010-10-30
        • 1970-01-01
        相关资源
        最近更新 更多