代码之家  ›  专栏  ›  技术社区  ›  JimmyJ

用正则表达式替换小数

  •  2
  • JimmyJ  · 技术社区  · 17 年前

    我正在尝试构建一个正则表达式,它将替换任何不符合以下格式的字符:

    i.e.
    123            // 123
    123.123        // 123.123
    123.123.123a   // 123.123123
    123a.123       // 123.123
    

    我在php中使用ereg_替换,我管理的最接近工作正则表达式是

    ereg_replace("[^.0-9]+", "", $data);
    

    这几乎就是我所需要的(除此之外,它将允许任何数量的小数点)

    i.e.
    123.123.123a    // 123.123.123
    

    ereg_replace("[^0-9]+([^.]?[^0-9]+)?", "", $data);
    
    which was meant to translate as
    [^0-9]+        // any number of digits, followed by
    (              // start of optional segment
      [^.]?        // decimal point (0 or 1 times) followed by
      [^0-9]+      // any number of digits
    )              // end of optional segment
    ?              // optional segment to occur 0 or 1 times
    

    但这似乎只允许任意数量的数字,而不允许其他数字。

    请帮忙

    谢谢

    2 回复  |  直到 17 年前
        1
  •  8
  •   Gumbo    17 年前

    尝试以下步骤:

    1. 0-9 .
    2. 删除任何 在第一个小数点后。

    $str = preg_replace('/[^0-9.]+/', '', $str);
    $str = preg_replace('/^([0-9]*\.)(.*)/e', '"$1".str_replace(".", "", "$2")', $str);
    $val = floatval($str);
    

    另一个只有一个正则表达式:

    $str = preg_replace('/[^0-9.]+/', '', $str);
    if (($pos = strpos($str, '.')) !== false) {
        $str = substr($str, 0, $pos+1).str_replace('.', '', substr($str, $pos+1));
    }
    $val = floatval($str);
    
        2
  •  2
  •   Philippe Gerber    17 年前

    $s = preg_replace('/[^.0-9]/', '', '123.123a.123');
    if (1 < substr_count($s, '.')) {
        $a = explode('.', $s);
        $s = array_shift($a) . '.' . implode('', $a);
    }
    
    推荐文章