由于这个问题已经被浏览了很多次,我编写了一个函数,可能对其他发现这个问题的人有用。以下是包含一些测试值、函数 currencyToDecimal()
以及一些运行并显示测试的代码的脚本。你只需要函数本身。
如果您有其他未通过的测试用例,请告诉我,以便我们可以调整。
<?php
$testValues = [
'22,50 €',
'22 €',
'22€',
'$22.50',
'$22',
'$0.50¢',
'$22 000 000.50',
'22 000 000,50 €',
'22.000.000,50 €',
];
function currencyToDecimal($value) {
$value = trim($value);
$value = preg_replace('/(\d)(\s)(\d)/', '$1$3', $value);
if (stristr($value, '.') && stristr($value, ',')) {
if (strrpos($value, '.') < strpos($value, ',')) {
$value = str_replace('.', '', $value);
}
}
if (stristr($value, ',') && stristr($value, '.')) {
if (strrpos($value, ',') < strpos($value, '.')) {
$value = str_replace(',', '', $value);
}
}
$radixOptions = [',', ' '];
$value = str_replace(',', '.', $value);
$value = preg_replace('/[^\d\.]/', '', $value);
$value = floatval($value);
return $value;
}
echo("ORIGINAL => DECIMAL => DATA TYPE\n");
echo("*********************************************\n");
foreach ($testValues as $value) {
$result = currencyToDecimal($value);
$type = gettype($result);
if ($type === "double") {
$type = "float";
}
echo("$value => $result => $type\n");
}
以下是输出结果:
![测试输出](https://istack.dev59.com/vySlS.webp)
ORIGINAL => DECIMAL => DATA TYPE
*********************************************
22,50 € => 22.5 => float
22 € => 22 => float
22€ => 22 => float
$22.50 => 22.5 => float
$22 => 22 => float
$0.50¢ => 0.5 => float
$22 000 000.50 => 22000000.5 => float
22 000 000,50 € => 22000000.5 => float
22.000.000,50 € => 22000000.5 => float
References:
https://en.wikipedia.org/wiki/Decimal_separator
https://en.wikipedia.org/wiki/ISO_31-0
https://docs.oracle.com/cd/E19455-01/806-0169/overview-9/index.html
$ver_preco2
是从哪里来的? - John Conde$result = (preg_replace('/[^\d]/', '', $price) - preg_replace('/[^\d]/', '', $discount)) / 100;
- Havenard