以货币符号为前导的数字字符串始终变为 0

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

我有这个代码和

cast
一个以货币为前缀的数字到一个整数。

$t = "€2000";
$venc = (int)$t;
echo $venc; // actually echo is 0 and I want 2000 (remove symbol)

输出是

0
而不是
2000
,所以,代码没有按我的预期工作。

(int)$t;
不回显
2000
的原因是什么?

php casting symbols currency text-parsing
5个回答
9
投票

转换例程不会删除无效字符,而是从头开始,并在到达第一个无效字符时停止,然后将其转换为数字,在您的情况下,欧元符号无效,它是第一个字符,因此结果数字为0。

检查http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion

你可以试试

(int)preg_replace('/\D/ui','',$t);

但是,如果您正在处理货币,您不应该忘记它们不是整数而是浮点数

(float)preg_replace('/[^0-9\.]/ui','',$t);


4
投票

这可以帮助你

$t = preg_replace('/[^0-9]/i', '','€2000');
$venc = (int)$t;
echo $venc;

0
投票
$t = "€2000";
$venc = (int)substr($t,1);
echo $venc;

0
投票

使用子字符串

   echo substr($t,3);  // returns "2000"

0
投票

使用

sscanf()
可以轻松地将以欧元货币符号为前缀的字符串解析为整数或浮点类型值,甚至可以处理负值。

在第一个参数中,对欧元符号进行硬编码,然后使用

%d
将以下数字子字符串解析为整数,或使用
%f
解析浮点值。其他字符串函数不提供显式类型转换的好处。

代码:(演示

$tests = [
    "€1000",
    "€66.66",
    "€-5.0005",
];

$result = [];
foreach ($tests as $t) {
    sscanf($t, '€%d', $result["$t: asInteger"]);
    sscanf($t, '€%f', $result["$t: asFloat"]);
}
var_dump($result);

输出:

array(6) {
  ["€1000: asInteger"]=>
  int(1000)
  ["€1000: asFloat"]=>
  float(1000)
  ["€66.66: asInteger"]=>
  int(66)
  ["€66.66: asFloat"]=>
  float(66.66)
  ["€-5.0005: asInteger"]=>
  int(-5)
  ["€-5.0005: asFloat"]=>
  float(-5.0005)
}
© www.soinside.com 2019 - 2024. All rights reserved.