PHP:不格式化的钱

有没有办法获得像这样的string的浮点值: 75,25 € ,而不是parsefloat(str_replace(',', '.', $var))

我希望这是依赖于当前的网站语言,有时逗号可以用点代替。

您可以使用

  • NumberFormatter::parseCurrency – parsing货币编号

手册中的示例:

 $formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY); var_dump($formatter->parseCurrency("75,25 €", $curr)); 

给出: float(75.25)

请注意, intl扩展未默认启用。 请参阅安装说明 。

使用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 

所以你有它。 单行,一个replace。 你很好走。

这是一个更复杂/缓慢的解决scheme,但适用于所有的语言环境。 因为@ rlenom的解决scheme仅使用点作为小数点分隔符,而某些语言环境(如西class牙语)使用逗号作为小数点分隔符。

 <?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); } 

testing:

 ['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

你将需要从string中删除货币符号。 PHP的intval停在它find的第一个非数字字符处。

 $int = intval(preg_replace('/[^\d\.]/', '', '$100')); // 100 

虽然如果你有一个价值$100.25 ,你可能会想用floatval来代替。

 $float = floatval(preg_replace('/[^\d\.]/', '', '$100.25')); // 100.25 

PHP有intval ( 这里是文档 ),这是(据我所知)完全相同的JavaScript的parseInt

然而,对于什么是值得的,我不认为这两个函数都会帮助你做你正在做的事情。 因为第一个字符是非数字的,所以都吓坏了(PHP会给你0,JS会给你NaN )。 所以在任何一种语言,你将不得不做一些string/正则expression式parsing。

铸造是你的朋友:

 $int = (int) $string; 

基于op的 更新

尝试这样的事情:

 <?php function extract_numbers($string) { return preg_replace("/[^0-9]/", '', $string); } echo extract_numbers('$100'); ?> 

演示: http : //codepad.org/QyrfS7WE

我有一个类似的问题,我没有收到货币符号,只是string(即:1,234,567.89或1.234.567,89)。

这帮助我将两种情况归类为浮动:

 $val = str_replace(",", ".", $formatted); $val = preg_replace("/[\,\.](\d{3})/", "$1", $val); 

但戈登的回答更清晰。

我是一个新手,所以对下面的方法可能有一个显而易见的(对于其他人,而不是我),但是我认为我会分享它。 我有兴趣知道是否比使用preg_replace更快或更慢,但没有做任何速度testing。

 $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);