«Т» может быть «тысяча» или «триллион», вы знаете.
$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 рекомендуется хитрый трюк, поставьте "?" (необязательно) в скобках, и вы гарантированно соответствуете строке, она может быть просто пустой. Затем вы можете использовать пробел в качестве ключа массива, чтобы получить значение по умолчанию, не проверяя, соответствует ли оно или нет.
Собираем все это вместе:
$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);
}