正则表达式取代金钱模式

时间:2009-07-16 01:19:26

标签: php regex

我想请求帮助,我想检查字符串 匹配小数后跟一个字母(15M,15.3M,15T或15.3T)和 用零替换它。

喜欢这些: 15M - > 1500 15.3M - > 15300000 15T - > 15000 15.3T - > 15300

我尝试使用str_replace执行此操作,但无法正确执行此操作。希望 有人可以帮助我。

4 个答案:

答案 0 :(得分:3)

你知道,“T”可能是“千”或“万亿”。

$s = "15.7T";

$factors = Array('T' => 1000, 'M' => 1000000, 'B' => 1000000000.);

$matches = Array();
if (0 < preg_match('/([0-9]+(?:\.[0-9]*)?)([TMB])/', $s, $matches)) {
    print("$s -> " . $matches[1] * $factors[$matches[2]]);
}

打印:

15.7T -> 15700

编辑:

锚定(在前面或后面做任何垃圾意味着不匹配):

'/^(...)$/'

您可能希望允许空格,但是:

'/^\s*(...)\s*$/'

您也可以使用“\ d”代替“[0-9]:

'/(\d+(?:\.\d*)?)([TMB])/'

不区分大小写:

'/.../i'
...
print("$s -> " . $matches[1] * $factors[strtoupper($matches[2])]);

可选因素:

'/([0-9]+(?:\.[0-9]*)?)([TMB])?/'
$value = $matches[1];
$factor = isset($matches[2]) ? $factors[$matches[2]] : 1;
$output = $value * $factor;

使用printf控制输出格式:

print($value) -> 1.57E+10
printf("%f", $value);  -> 15700000000.000000
printf("%.0f", $value);  -> 15700000000

Stephan202 recommended一个聪明的把戏,把“?” (可选)在parens中你保证匹配字符串,它可能是空白的。然后,您可以使用空格作为数组键来获取默认值,而无需测试它是否匹配。

把所有这些放在一起:

$factors = Array('' => 1, 'T' => 1e3, 'M' => 1e6, 'B' => 1e9);
if (0 < preg_match('/^\s*(\d+(?:\.\d*)?)([TMB]?)\s*$/i', $s, $matches)) {
    $value = $matches[1];
    $factor = $factors[$matches[2]];
    printf("'%s' -> %.0f", $s, $value * $factor);
}

答案 1 :(得分:2)

替代版本对所有找到的价格执行转换:

  $multiply = array('' => 1, 'T' => 1000, 'M' => 1000000);

  function convert($matches) {
    global $multiply;
    return $matches[1] * $multiply[$matches[3]];
  }

  $text = '15M 15.3M 15.3T 15';
  print(preg_replace_callback('/(\d+(\.\d+)?)(\w?)/', 'convert', $text));

答案 2 :(得分:0)

Perl:

#!/usr/bin/perl

use strict;
use warnings;

my %factors = (
    B => 1_000_000_000,
    M => 1_000_000,
    T => 1_000,
);

while ( <DATA> ) {
    next unless m{
        ^
        (?<number> -? [0-9]+ (?:\.[0-9]+)? )
        (?<factor>B|M|T)?
        $
    }x;
    my $number = $+{factor}
               ? sprintf( '%.0f', $+{number} * $factors{ $+{factor} } )
               : $+{number}
               ;
    print $number, "\n";
}

__DATA__
15M
15B
15T
15.3M
15.3B
15.3T
15
15.3

输出:

C:\Temp> z
15000000
15000000000
15000
15300000
15300000000
15300
15
15.3

答案 3 :(得分:0)

不知道如何在一个正则表达式中创建它,这是我在Ruby中的尝试。

#!/usr/bin/ruby

def trans s
h={"M"=>10**6 ,"T"=>10**3}
a = s.split(/[MT]/) + [s.split("").last]
(a[0].to_f * h[a[1]]).to_i
end


puts trans "15M"
puts trans "15.3M"
puts trans "15T"
puts trans "15.3T"