如何正确提取十进制字符串

时间:2017-11-19 16:44:34

标签: php

我可以在字符串

中使用不同的元素
€10.09
69 EUR
69.55$
...

我只想要这个号码。 我做到了,但.未被考虑

  preg_match_all('!\d+!', $price, $matches);
  $out =  (int)implode('', $matches[0]);

结果:

1009
6955

4 个答案:

答案 0 :(得分:1)

您可以使用它来提取值:

<?php 
$price = "$10.09,€10.09,69 EUR,69.55$";
  $prices = explode(",",$price);
  foreach($prices as $num){
    preg_match_all('!\d+(\.\d+)?!', $num, $matches);
    $out =  (float)implode('', $matches[0]);
    echo $out." ";
  }
?>

结果:

10.09 10.09 69 69.55

答案 1 :(得分:0)

你的方法比大多数人打扰要复杂得多。虽然我鼓励你设法用正则表达式解决它,但在这种情况下货币处理的实用方法是

(float) filter_var( $price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) );

这将返回浮点值,考虑小数

答案 2 :(得分:0)

Tk的 完成以找到解决方案 与这些元素一起工作

  preg_match_all('!\d+!', $price, $matches);
  $price_extracted =  (float)implode('.', $matches[0]);

答案 3 :(得分:0)

对于&#34; old-skool&#34;感到抱歉,但我全都是关于指针的,我来自C&#34; / asm背景,在嵌入式RTOS系统512的时代每个任务的堆栈字节是梦想成真所以...... 在这里,它完全针对速度进行了优化。如果我能做* p ++ :) :) :))

function extractNumber($s) {
  $started = false;
   $r = "";
  for($i=0; $i<strlen($s); $i++) {
    $c = $s[$i];
    if (($c<'0') && ($c!='.'))
      continue;
    if ($c>'9') {
      if (!$started)
        continue;
      else
        break;
    }
    $started = true;
    $r .= $c;
  }
  return $r;
}

这个例程的整个运行时间甚至比关于运行正则表达式的思考要快。我没有这样做,但是如果你进行一些模拟,我猜我的速度比所提出的所有正则表达式/内爆/爆炸解决方案快至少500%。