我必须向数据库中插入从各个网站获取的数字,但我不知道小数分隔符/千位分隔符是什么。
输入表示值
1000
的数字可以是:
1,000.00
1,000.000
1.000,00
1.000,000
输入表示值
1
的数字可以是:
1.00
1.000
1,00
1,000
当然,数字和小数点可能会有所不同。
根据您的解释,最后出现的点或逗号将是小数点分隔符。拆分最后一个符号以访问整数、分隔符和小数值。然后根据需要处理/格式化这些部分。
代码:(演示)
$tests = [
'1,000.00',
'1,000.000',
'1.000,00',
'1.000,000',
'1.00',
'1.000',
'1,00',
'1,000',
];
foreach ($tests as $test) {
[$int, $sep, $dec] = preg_split('/.*\K([.,])/', $test, 3, PREG_SPLIT_DELIM_CAPTURE);
var_dump($test, $int, $sep, $dec);
echo "\n";
}
输出:
string(8) "1,000.00"
string(5) "1,000"
string(1) "."
string(2) "00"
string(9) "1,000.000"
string(5) "1,000"
string(1) "."
string(3) "000"
string(8) "1.000,00"
string(5) "1.000"
string(1) ","
string(2) "00"
string(9) "1.000,000"
string(5) "1.000"
string(1) ","
string(3) "000"
string(4) "1.00"
string(1) "1"
string(1) "."
string(2) "00"
string(5) "1.000"
string(1) "1"
string(1) "."
string(3) "000"
string(4) "1,00"
string(1) "1"
string(1) ","
string(2) "00"
string(5) "1,000"
string(1) "1"
string(1) ","
string(3) "000"
如果您的目标是标准化占位符,则只能翻译非标准占位符。后面跟有逗号的任何点以及后面没有跟点的任何逗号都需要更改。 演示
var_export(
preg_replace_callback(
'/\.(?=.*,)|,(?=\d*$)/',
fn($m) => ['.' => ',', ',' => '.'][$m[0]],
$tests
)
);
要删除千个占位符并标准化小数占位符,您可以对字符串进行两次传递。 演示
var_export(
preg_replace(
['/[.,](?=\d*[.,])/', '/,/'], // match thousands, match comma decimals
['', '.'], // remove thousands, replace comma decimals
$tests
)
);