我想从 PHP 中的字符串解析货币,我已经查看了 数字格式化程序,但还没有 PHP 5.3 或添加扩展的能力。
货币每个字符串仅存在一次,并且将以货币符号为前缀,在我的例子中为英镑符号 £。货币可能采用以下格式之一:
£0.90
£100
£100.10
£1000
实现这一目标的最佳方法是什么?
编辑
这是一个示例字符串:
Paid a bill £153.93
我想将货币值放入变量中。
(float)substr($input, strpos($input, "£")+1);
这将为您带来以下结果:
float(0.9)
float(100)
float(100.1)
float(1000)
float(153.93)
编辑:更新以反映问题的更改。这是假设所有字符串都像您作为示例给出的字符串一样。
我还有另一个答案。可能比使用 strpos 快一点,如果输入中可能有空格会更好。
$input = "£250.75";
$output = floatval(ltrim($input,"£"));
echo $output;
250.75
您还可以将其他货币添加到 ltrim 中的字符列表中:
$output = floatval(ltrim($input,"£$¢"));
这将从数字的左侧删除 $ 或 £ 或 ¢ 以及空格,这将破坏上面使用 strpos 的解决方案。此外,如果在某些情况下省略货币符号,这也会产生相同的结果。
preg_match('/(?<=£)(?=[\d.]*\d)(\d*(?:\.\d*)?)/', $input, $matches);
将在以下任何一个中找到匹配项:
等等
你可以用正则表达式来做到这一点($matches[1]将有你的值):
preg_match('/£([0-9]+|[0-9]+\.?[0-9]{2})/', $text, $matches);
通过一次本机函数调用直接完成这一切 -
sscanf()
。
使用数组前面的一个或多个非 £ 字符,但不将其分配给引用变量或返回它(这就是
*
的作用)。捕获 £ 之后的浮点表达式字符串。捕获的字符串将表示为返回数组中的单独元素,其数据类型将为 float。
代码:(演示)
$tests = [
'Paid a bill £0.90',
'Paid a bill £100',
'Paid a bill £100.10',
'Paid a bill £1000'
];
foreach ($tests as $test) {
var_dump(sscanf($test, '%*[^£]£%f')[0]);
echo "\n";
}
输出:
float(0.9)
float(100)
float(100.1)
float(1000)
格式参数开头的非捕获占位符 (
%*[^£]
) 必须匹配 1 个或多个字符。 如果输入字符串可能以 £
开头,只需无条件地在前面添加任意字符,例如空格,例如:scanf(" $test", '%*[^£]£%f')[0]
$price = (float) substr($input, 1, strlen($input) - 1);