在 PHP 中解析时取消金钱格式

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

除了

75,25 €
之外,有没有办法获取像这样的字符串的浮点值:
parsefloat(str_replace(',', '.', $var))

我希望这取决于当前的站点语言,有时逗号可以用点代替。

php parsing floating-point currency
9个回答
57
投票

这是一个有点复杂/缓慢的解决方案,但适用于所有区域设置。 @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);
    $removedThousandSeparator = preg_replace('/(\.|,)(?=[0-9]{3,}$)/', '',  $stringWithCommaOrDot);

    return (float) str_replace(',', '.', $removedThousandSeparator);
}

测试:

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


47
投票

你可以使用

手册示例:

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

给出:

float(75.25)

请注意,默认情况下不启用 intl 扩展。请参阅安装说明


47
投票

使用ereg_replace

$string = "$100,000";
$int = ereg_replace("[^0-9]", "", $string); 
echo $int;

输出

1000000

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

所以你已经得到它了。单行,一次替换。你可以走了。


10
投票

您需要从字符串中删除货币符号。 PHP 的

intval
在找到的第一个非数字字符处停止。

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

尽管如果您有像

$100.25
这样的值,您可能想使用
floatval
来代替。

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

2
投票

PHP 有

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

但是,就其价值而言,我认为这两个功能都无法帮助您完成您想要做的事情。因为第一个字符是非数字,所以两者都吓坏了(PHP 会给你 0,JS 会给你

NaN
)。因此,无论哪种语言,您都必须进行一些字符串/正则表达式解析。


2
投票

我是一个新手,所以下面的方法可能有一个明显的(对其他人,而不是我)缺点,但我想无论如何我都会分享它。我很想知道它比使用 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);

1
投票

选角是你的朋友:

$int = (int) $string;

更新 基于op

尝试这样的事情:

<?php

function extract_numbers($string)
{
    return preg_replace("/[^0-9]/", '', $string);
}

echo extract_numbers('$100');

?>

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


1
投票

我遇到了类似的问题,我没有收到货币符号,只收到字符串(即:1,234,567.89 或 1.234.567,89)。

这帮助我将两种情况标准化为浮点数:

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

但戈登的答案更清晰。


0
投票

每个人都认为他们是通过正则表达式进化而来的,但速度非常慢。由于大多数人目前仅使用 1 种格式,因此实际上就像删除已知的无关字符和符号一样简单:

dollars = '$1,321.42';
n = parseInt(dollars.replace('$','').replace(',',''));

n is 1321.42

没有必要让事情变得更复杂。

© www.soinside.com 2019 - 2024. All rights reserved.