有没有办法获得这样的字符串的浮点值:75,25 €
,而不是parsefloat(str_replace(',', '.', $var))
?
我希望这取决于当前的网站语言,有时逗号可以用点替换。
答案 0 :(得分:44)
这是一个更复杂/更慢的解决方案,但适用于所有语言环境。因为@ rlenom的解决方案仅使用点作为小数分隔符,并且某些语言环境(如西班牙语)使用逗号作为小数分隔符。
<?php
public function getAmount($money)
{
$cleanString = preg_replace('/([^0-9\.,])/i', '', $money);
$onlyNumbersString = preg_replace('/([^0-9])/i', '', $money);
$separatorsCountToBeErased = strlen($cleanString) - strlen($onlyNumbersString) - 1;
$stringWithCommaOrDot = preg_replace('/([,\.])/', '', $cleanString, $separatorsCountToBeErased);
$removedThousendSeparator = preg_replace('/(\.|,)(?=[0-9]{3,}$)/', '', $stringWithCommaOrDot);
return (float) str_replace(',', '.', $removedThousendSeparator);
}
试验:
['1,10 USD', 1.10],
['1 000 000.00', 1000000.0],
['$1 000 000.21', 1000000.21],
['£1.10', 1.10],
['$123 456 789', 123456789.0],
['$123,456,789.12', 123456789.12],
['$123 456 789,12', 123456789.12],
['1.10', 1.1],
[',,,,.10', .1],
['1.000', 1000.0],
['1,000', 1000.0]
注意事项: 如果小数部分超过两位,则失败。
这是此库中的一个实现: https://github.com/mcuadros/currency-detector
答案 1 :(得分:42)
您可以使用
手册示例:
$formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
var_dump($formatter->parseCurrency("75,25 €", $curr));
给出:float(75.25)
请注意,默认情况下未启用intl extension。请参阅Installation Instructions。
答案 2 :(得分:40)
使用ereg_replace
$string = "$100,000";
$int = ereg_replace("[^0-9]", "", $string);
echo $int;
输出
百万
function toInt($str)
{
return (int)preg_replace("/\..+$/i", "", preg_replace("/[^0-9\.]/i", "", $str));
}
<强>更新强>
<?php
$string = array("$1,000,000.00","$1 000 000.00","1,000 000.00","$123","$123 456 789","0.15¢");
foreach($string as $s) {
echo $s . " = " . toInt($s) . "\n";
}
function toInt($str)
{
return preg_replace("/([^0-9\\.])/i", "", $str);
}
?>
<强>输出强>
$1,000,000.00 = 1000000.00
$1 000 000.00 = 1000000.00
1,000 000.00 = 1000000.00
$123 = 123
$123 456 789 = 123456789
0.15¢ = 0.15
如果你把它作为整数转换
<?php
$string = array("$1,000,000.00","$1 000 000.00","1,000 000.00","$123","$123 456 789","0.15¢");
foreach($string as $s) {
echo $s . " = " . _toInt($s) . "\n";
}
function _toInt($str)
{
return (int)preg_replace("/([^0-9\\.])/i", "", $str);
}
?>
<强>输出强>
$1,000,000.00 = 1000000
$1 000 000.00 = 1000000
1,000 000.00 = 1000000
$123 = 123
$123 456 789 = 123456789
0.15¢ = 0
所以你有它。单行,一个替换。你很高兴。
答案 3 :(得分:9)
您需要从字符串中删除货币符号。 PHP的intval
在找到的第一个非数字字符处停止。
$int = intval(preg_replace('/[^\d\.]/', '', '$100')); // 100
虽然如果您的值为$100.25
,但您可能希望使用floatval
。
$float = floatval(preg_replace('/[^\d\.]/', '', '$100.25')); // 100.25
答案 4 :(得分:2)
PHP有intval
(here are the docs),这是(据我所知)与JavaScript的parseInt
完全相同。
然而,对于什么是值得的,我认为这两种功能都不会帮助你做你想做的事情。因为第一个字符是非数字字符,所以两者都吓坏了(PHP会给你0,JS会给你NaN
)。所以在任何一种语言中,你都必须进行一些字符串/正则表达式解析。
答案 5 :(得分:1)
施法是你的朋友:
$int = (int) $string;
更新 基于op :
尝试这样的事情:
<?php
function extract_numbers($string)
{
return preg_replace("/[^0-9]/", '', $string);
}
echo extract_numbers('$100');
?>
答案 6 :(得分:1)
我有一个类似的问题,我没有收到货币符号,只有字符串(即:1,234,567.89或1.234.567,89)。
这有助于我将两个案例规范化为浮点数:
$val = str_replace(",", ".", $formatted);
$val = preg_replace("/[\,\.](\d{3})/", "$1", $val);
但戈登的答案更清晰。
答案 7 :(得分:1)
我是一个新手,所以下面的方法可能有一个显而易见的(对他人,不是我),但我想我会分享它。我有兴趣知道它是否比使用preg_replace更快或更慢,但没有进行任何速度测试。
$badChars = array("$", ",", "(", ")");
$dirtyString = "($3,895.23)";
$cleanString = str_ireplace($badChars, "", $dirtyString);
echo "$dirtyString becomes $cleanString<p>";
$ dirtyString可以是一个数组,所以:
$badChars = array("$", ",", "(", ")");
$dirtyStrings = array("($3,895.23)", "1,067.04", "$5683.22", "$9834.48");
$cleanStrings = str_ireplace($badChars, "", $dirtyStrings);
echo var_dump($cleanStrings);