Php 如何在同时包含符号和值的字符串中标识货币符号?

Php 如何在同时包含符号和值的字符串中标识货币符号?,php,formatting,currency,Php,Formatting,Currency,我正在通过XML将数据导入脚本(不重要)。。。部分数据是包含货币符号和金额的数值金额,例如: ["price"]=> string(6) "$65.00" ["price"]=> string(8) "€14.20" 现在,我正在寻找一种方法来自动计算出哪个位是货币符号,哪个位是值。我无法保证收到的数据的质量,例如金额可能是14000.22英镑,或者符号可能不仅仅是一个字母-即瑞士法郎-瑞士法郎 谁能给我指出正确的方向吗?我试过这个代码,它适用于美元符号,但不适用于欧元符号: if

我正在通过XML将数据导入脚本(不重要)。。。部分数据是包含货币符号和金额的数值金额,例如:

["price"]=> string(6) "$65.00"
["price"]=> string(8) "€14.20"
现在,我正在寻找一种方法来自动计算出哪个位是货币符号,哪个位是值。我无法保证收到的数据的质量,例如金额可能是14000.22英镑,或者符号可能不仅仅是一个字母-即瑞士法郎-瑞士法郎

谁能给我指出正确的方向吗?我试过这个代码,它适用于美元符号,但不适用于欧元符号:

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

array(1) {
  [0]=>
  string(1) "$"
}
作为参考,我查看了世界货币符号列表。

可能使用preg函数,而不是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);
可能使用而不是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);

我不确定您处理的确切源数据是什么。然而,在会计中,不同的货币有不同的格式。例如,某些货币会在其货币符号前加前缀。其他人会给这个符号加后缀。根据货币的语言,十进制也可能有不同的符号

/^(\D*)\s*([\d,\.]+)\s*(\D*)$/
上述正则表达式(JavaScript风格,您可能需要对其进行转义以将其转换为PHP)将与以下内容匹配:

  • 14,20欧元
  • 65美元
  • 65.00美元

    • 我不确定您处理的确切源数据是什么。然而,在会计中,不同的货币有不同的格式。例如,某些货币会在其货币符号前加前缀。其他人会给这个符号加后缀。根据货币的语言,十进制也可能有不同的符号

      /^(\D*)\s*([\d,\.]+)\s*(\D*)$/
      
      上述正则表达式(JavaScript风格,您可能需要对其进行转义以将其转换为PHP)将与以下内容匹配:

      • 14,20欧元
      • 65美元
      • 65.00美元

        • 下面的简单正则表达式可能会有所帮助

          价格

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

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

          下面的简单正则表达式可能会有所帮助

          价格

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

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

          我会在PHP5中使用数字格式

          要求:

          • (PHP5>=5.3.0,PECL intl>=1.0.0)
          示例代码:

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

          主页:

          我会在PHP5中使用数字格式

          要求:

          • (PHP5>=5.3.0,PECL intl>=1.0.0)
          示例代码:

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

          主页:

          以下内容将以
          $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);
          }
          

          下面将以
          $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);
          }
          

          你的问题是编码。我同意-但是编码是我无法控制的,所以我们在寻找其他方法来完成分离你的问题是编码。我同意-但是编码是我无法控制的,所以我们在寻找其他方法来完成分离不幸的是php无法在这台机器上升级(其版本为5.2.6)-很好的解决方案。不幸的是,php无法在这台机器上升级(它在5.2.6上)-很好的解决方案。我稍微修改了它以供我使用,但是这是我与其他人相比使用的一个(都很好),我稍微修改了它以供我使用,但是这是我与其他人相比使用的一个(都很好)