解析字符串并在货币符号后隔离浮点值

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

我想从 PHP 中的字符串解析货币,我已经查看了 数字格式化程序,但还没有 PHP 5.3 或添加扩展的能力。

货币每个字符串仅存在一次,并且将以货币符号为前缀,在我的例子中为英镑符号 £。货币可能采用以下格式之一:

£0.90
£100
£100.10
£1000

实现这一目标的最佳方法是什么?

编辑

这是一个示例字符串:

Paid a bill £153.93

我想将货币值放入变量中。

php string floating-point currency text-parsing
6个回答
10
投票
(float)substr($input, strpos($input, "£")+1);

这将为您带来以下结果:

float(0.9)
float(100)
float(100.1)
float(1000)
float(153.93)

编辑:更新以反映问题的更改。这是假设所有字符串都像您作为示例给出的字符串一样。


7
投票

我还有另一个答案。可能比使用 strpos 快一点,如果输入中可能有空格会更好。

$input = "£250.75";
$output = floatval(ltrim($input,"£"));
echo $output;
250.75

您还可以将其他货币添加到 ltrim 中的字符列表中:

$output = floatval(ltrim($input,"£$¢"));

这将从数字的左侧删除 $ 或 £ 或 ¢ 以及空格,这将破坏上面使用 strpos 的解决方案。此外,如果在某些情况下省略货币符号,这也会产生相同的结果。


2
投票
preg_match('/(?<=£)(?=[\d.]*\d)(\d*(?:\.\d*)?)/', $input, $matches);

将在以下任何一个中找到匹配项:

  • £.10
  • 0.10 英镑
  • 100 英镑
  • £100.00

等等


0
投票

你可以用正则表达式来做到这一点($matches[1]将有你的值):

preg_match('/£([0-9]+|[0-9]+\.?[0-9]{2})/', $text, $matches);

0
投票

通过一次本机函数调用直接完成这一切 -

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]


-3
投票
$price = (float) substr($input, 1, strlen($input) - 1);
© www.soinside.com 2019 - 2024. All rights reserved.