我想请求帮助,我想检查字符串 匹配小数后跟一个字母(15M,15.3M,15T或15.3T)和 用零替换它。
喜欢这些: 15M - > 1500 15.3M - > 15300000 15T - > 15000 15.3T - > 15300
我尝试使用str_replace
执行此操作,但无法正确执行此操作。希望
有人可以帮助我。
答案 0 :(得分:3)
$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"