Как определить символ валюты в строке, в которой есть как символ, так и значение? - PullRequest
0 голосов
/ 23 февраля 2011

Я получаю данные в скрипт через XML (не важно) ... Часть данных - это значение, которое включает символ валюты и сумму, например:

["price"]=> string(6) "$65.00"
["price"]=> string(8) "€14.20"

СейчасЯ ищу способ автоматически определить, какой бит является символом валюты, а какой - значением.Я не могу гарантировать качество поступающих данных, например, сумма может составлять £ 14 000,22, или символ может быть не просто одной буквой - то есть швейцарские франки - CHF.

Может кто-нибудь указать мне правонаправление?Я попробовал этот код, который работал для символа доллара, но не для символа евро:

if (preg_match('/\p{Sc}/',trim($price),$matches)) {
                var_dump($matches);
}

output

array(1) {
  [0]=>
  string(1) "$"
}

Для справки я посмотрел на http://www.xe.com/symbols.php списоксимволы валют мира.

Ответы [ 5 ]

2 голосов
/ 23 февраля 2011

Следующая сумма даст вам сумму в $matches[2], а символ валюты или буквенное представление всегда будут в $matches[1] или $matches[3] соответственно.

$values = array("$5.00", "€1.23", "£1,323.45", "1.23USD");
foreach($values as $val)
{
    preg_match("/([^0-9.,]*)([0-9.,]*)([^0-9.,]*)/", $val, $matches);
    print_r($matches);
}
2 голосов
/ 23 февраля 2011

Я не уверен, с какими точными исходными данными вы имеете дело. Однако в бухгалтерском учете существуют разные форматы для разных валют. Например, некоторые валюты имеют префикс своего символа валюты. Другие будут суффиксом символа. В зависимости от языка валюты у вас могут быть разные символы для десятичной дроби.

/^(\D*)\s*([\d,\.]+)\s*(\D*)$/

Вышеприведенное регулярное выражение (разновидность JavaScript, вам может понадобиться экранировать его для преобразования в PHP), будет соответствовать следующему:

  • € 14,20
  • $ 65,00
  • 65.00USD
0 голосов
/ 23 февраля 2011

Я бы использовал числовой формат в PHP 5.

Требования:

  • (PHP 5> = 5.3.0, int PECL> = 1.0.0)

Код образца:

$Format = new NumberFormatter("en", NumberFormatter::TYPE_DOUBLE);
echo $Format->format("$1928.77");

Домашняя страница: http://www.php.net/manual/en/class.numberformatter.php

0 голосов
/ 23 февраля 2011

Может помочь следующее простое регулярное выражение

цена

  grep -o '[0-9.,]*'

Символ

  grep -o '[^0-9.,]*'
0 голосов
/ 23 февраля 2011

Возможно использование sscanf () вместо функции preg

$price = "$65.00";
list($symbol, $price) = sscanf($price,'%[^0-9]%s');
var_dump($symbol);
var_dump($price);

$price= "€14.20";
list($symbol, $price) = sscanf($price,'%[^0-9]%s');
var_dump($symbol);
var_dump($price);

$price= "CHF1,357.99";
list($symbol, $price) = sscanf($price,'%[^0-9]%s');
var_dump($symbol);
var_dump($price);
...