2014-09-22 136 views
7

我有这样2 661,38 €一个字符串,我需要呼应661,38,但我不能达到解决用字符串格式化使用PHP

我也做了下面的代码:

$connection=mysql_connect('localhost','root','****') or die(mysql_error()); 

mysql_select_db('DB',$connection) or die(mysql_error()); 

$sql = mysql_query("select distinct prod_price COL from TABLE") or die(mysql_error()); 

?> 

<?php 
    while($row=mysql_fetch_object($sql)):?> 

<?php 


if(mysql_num_rows($sql)>0){ 

$number = $row->COL; 
$temp=explode(' ',$number); 
$number = preg_replace("/[^0-9]/", '', $temp[0])/100; 
echo number_format($number, 2, ',', ' '). "<br />"; 
} 
?> 
    <?php endwhile;?> 

灿任何人都请帮我从第一个地方移除那2个?

我得到的解决方案并没有帮助我,所以我把整个代码理解我被卡住的情况......请看代码片段......上面的代码给了我下面的通知:

注意:未定义抵消:2 /var/www/html/login/str.php在线26 0,00

+12

哪里串从何而来?它看起来像一个曲解UTF-8字符串 - 也许你应该先解决编码问题。 – georg 2014-09-22 10:31:01

+0

它来自DB – user3305327 2014-09-22 10:31:42

+0

即使可以在数据库层中有效处理这个问题,您也会在应用程序层上增加更多负载!您必须将数据库字符集更改为utf-8,然后将数据库归类为utf8_general_ci,然后将数据库支持unicode,从而使您不必担心现在打算执行的操作。 – freerunner 2014-09-22 11:10:02

回答

0

你分割与空间字符串,十申请的preg_replace()

<?php 
$number = "2 661,38 €"; 
$temp=explode(' ',$number); 
$number = preg_replace("/[^0-9]/", '', $temp[1])/100; 
echo number_format($number, 2, ',', ' '); 
?> 

DEMO

+1

请解释此代码如何帮助解决原始问题。答案的目标不仅是要解决原始问题,还要帮助该主题的更多读者理解基本问题和解决方案。只有代码的浏览器被认为是低质量的帖子。 – Pred 2014-09-22 11:10:59

+0

@Pred这不是一个解决方案吗? – Shin 2014-09-22 11:35:21

+1

这可能是一个解决方案,但如果有人阅读这篇文章在将来与有限或零与正则表达式或PHP相关的知识,代码本身可能无济于事。这个答案(提供的正则表达式和代码如何)帮助或解决原始问题的简短解释可能非常有用。 – Pred 2014-09-22 11:50:04

1

如果您在2 661,38 € ASCII字符串转换为十六进制数,那么你会看到下面的顺序:32 C2 20 36 36 31 2C 33 38 C2 20 E2 82 AC

这个序列中的UTF-8是2 661,38 €有两个控制字符(\xC2)。

我认为,这是严格的编码问题,所以你必须将原始字符串(与原始字符集)转换为UTF-8。

你可以用下面的表达式做到这一点在MySQL:

CONVERT(CONVERT(YourColumn USING binary) USING utf8) 

这可能返回NULL如果原始值无法转换为UTF8,但如果它是一个有效的UTF8序列,那么它将会被转换。

也请确保连接和PHP文件的编码也是UTF-8。不同的编码可能会导致意外的行为。

0

首先你需要改变你的数据库表。转到您的表结构和变化的排序规则设置到utf8_general_ci,那么你需要设置页眉

0

这将摆脱一切,除了数字和逗号:

$number = preg_replace("/[^0-9,]*/", '', $your_weird_pattern);