如何获取未知数字的当前小数/千位分隔符

问题描述 投票:0回答:1

我必须向数据库中插入从各个网站获取的数字,但我不知道小数分隔符/千位分隔符是什么。

输入表示值

1000
的数字可以是:

1,000.00
1,000.000
1.000,00
1.000,000

输入表示值

1
的数字可以是:

1.00
1.000
1,00
1,000

当然,数字和小数点可能会有所不同。

php web-scraping localization numeric separator
1个回答
0
投票

根据您的解释,最后出现的点或逗号将是小数点分隔符。拆分最后一个符号以访问整数、分隔符和小数值。然后根据需要处理/格式化这些部分。

代码:(演示

$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
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.