我喜欢将带有价格的字符串转换为浮点值。价格来自不同的语言和国家,可能如下所示:
1,00 €
€ 1.00
1'000,00 EUR
1 000.00$
1,000.00$
1.000,00 EURO
或者你能想到的任何东西......
我不确定我的示例是否具有全方位的可能性。我也不确定是否有可能盲目进行国际转换,也许我必须使用语言代码?所以一开始欧元和美元就足够了。
floatval()
有点傻,所以我需要更多的东西。我想我应该首先删除数字旁边的所有字符,
和.
。然后修复,
/ .
并最终使用floatval。
以前是否有人这样做过,可以帮助我一点?
我更喜欢没有正则表达式的解决方案;)
答案 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