要浮动的价格字符串

时间:2012-02-02 10:15:15

标签: php

我喜欢将带有价格的字符串转换为浮点值。价格来自不同的语言和国家,可能如下所示:

 1,00 €
 € 1.00
 1'000,00 EUR
 1 000.00$
 1,000.00$
 1.000,00 EURO

或者你能想到的任何东西......

我不确定我的示例是否具有全方位的可能性。我也不确定是否有可能盲目进行国际转换,也许我必须使用语言代码?所以一开始欧元和美元就足够了。

floatval()有点傻,所以我需要更多的东西。我想我应该首先删除数字旁边的所有字符,.。然后修复, / .并最终使用floatval。

以前是否有人这样做过,可以帮助我一点?

我更喜欢没有正则表达式的解决方案;)

6 个答案:

答案 0 :(得分:15)

好的,我自己尝试过。你怎么看待这个?

function priceToFloat($s)
{
    // convert "," to "."
    $s = str_replace(',', '.', $s);

    // remove everything except numbers and dot "."
    $s = preg_replace("/[^0-9\.]/", "", $s);

    // remove all seperators from first part and keep the end
    $s = str_replace('.', '',substr($s, 0, -3)) . substr($s, -3);

    // return float
    return (float) $s;
}

这里有一些测试:http://codepad.org/YtiHqsgz

对不起。我无法包含其他功能,因为键盘不喜欢它们。但是我对它们进行了比较,并且遇到了像“22 000,76”或“22.000”

这样的字符串的问题

更新:正如Limitless isa指出的那样,您可能会看一下函数money-format中的构建。

答案 1 :(得分:2)

删除所有非数字字符应该以美分为单位。然后,您可以将其除以100以获得“人类可读”字样。价钱。您可以使用filter_var FILTER_SANITIZE_NUMBER_INT之类的内容执行此操作。例如:

$cents = filter_var($input, FILTER_SANITIZE_NUMBER_INT);
$price = floatval($cents / 100);

以上是未经测试的,但类似的东西可能是您正在寻找的东西。

答案 2 :(得分:2)

此功能将解决您的问题:

function priceToSQL($price)
{
    $price = preg_replace('/[^0-9\.,]*/i', '', $price);
    $price = str_replace(',', '.', $price);

    if(substr($price, -3, 1) == '.')
    {
        $price = explode('.', $price);
        $last = array_pop($price);
        $price = join($price, '').'.'.$last;
    }
    else
    {
        $price = str_replace('.', '', $price);
    }

    return $price;
}

答案 3 :(得分:2)

价格到数字 数字到价格的例子

<?php

    $number="1.050,50";

    $result=str_replace(',','.',str_replace('.','',$number));
    echo $result. "<br/>";
    // 1050.50

    setlocale(LC_MONETARY, 'tr_TR');
    echo money_format('%!.2n', $result) ;
    // 1.050,50

?>

答案 4 :(得分:1)

删除除号码,逗号和句号以外的所有内容:

<?php

$prices = array( "1,00 €",
 "€ 1.00",
 "1'000,00 EUR",
 "1 000.99$",
 "1,000.01$",
 "1.000,10 EURO");

$new_prices = array();
foreach ($prices as $price) {
    $new_prices[] = preg_replace("/[^0-9,\.]/", "", $price);
}

print_r($new_prices);

输出:

Array ( [0] => 1,00 [1] => 1.00 [2] => 1000,00 [3] => 1000.99 [4] => 1,000.01 [5] => 1.000,10 )

现在让我们使用Michiel - php.net中的parseFloat函数(我不会在这里粘贴它,因为它是一个非常大的函数):

<?php

$prices = array( "1,00 €",
 "€ 1.00",
 "1'000,00 EUR",
 "1 000.99$",
 "1,000.01$",
 "1.000,10 EURO");

$new_prices = array();
foreach ($prices as $price) {
    $new_prices[] = parseFloat(preg_replace("/[^0-9,\.]/", "", $price));
}

print_r($new_prices);

输出将是:

Array ( [0] => 1 [1] => 1 [2] => 1000 [3] => 1000.99 [4] => 1000.01 [5] => 1000.1 )

答案 5 :(得分:0)

不完美,但它有效

function priceToFloat($s){
    // clear witespaces
    $s = trim($s);
    $s = str_replace(' ', '', $s);

    // is it minus value
    $is_minus = false;
    if(strpos($s, '(') !== false)
        $is_minus = true;
    if(strpos($s, '-') !== false)
        $is_minus = true;

    // check case where string has "," and "."
    $dot = strpos($s, '.');
    $semi = strpos($s, ',');
    if($dot !== false && $semi !== false){
        // change fraction sign to #, we change it again later
        $s = str_replace('#', '', $s); 
        if($dot < $semi) $s = str_replace(',','#', $s);
        else $s = str_replace('.','#', $s);

        // remove another ",", "." and change "#" to "."
        $s = str_replace([',','.', '#'], ['','', '.'], $s);
    } 
    $s = str_replace(',', '.', $s); 
    // clear usless elements
    $s = preg_replace("/[^0-9\.]/", "", $s);

    // if it minus value put the "-" sign
    if($is_minus) $s = -$s;
    return (float) $s;
}

工作案例

$prices = [
    '123.456,789',
    '123,456.789',
    '123 456,789',
    '123 456.789',
    '-123,456.789',
    '(123,456.789)',
];
foreach($prices as $price)
     echo priceToFloat($price).'<br />';

返回

123456.789
123456.789
123456.789
123456.789
-123456.789
-123456.789