2012-07-17 33 views
-1

我看到有人试图让MySQL使用','作为浮点分隔符 - 我想要做的是stop PHP使用它在'nl_NL'语言环境下运行的网站上。PHP> MySQL浮点分隔符本地化问题

代码PHP

所以在写一样结束一个SQL查询:

" ... HAVING `relevance` >= {$fFloatingPointNumber}"; 

的问题是,因为PHP的语言环境运行为“nl_NL”时,其转换是浮点数到字符串它使用' ,'作为分隔符(例如1,5)。

我在做什么,以防止这种情况目前是:

" ... HAVING `relevance` >= " . number_format($fFloatingPointNumber, 2, '.', ''); 

是否有这样做的更好的办法 - 或者这是我最好的选择?

+0

你能不能创建用于数据库查询的某种包装器,可以将场所临时更改为使用“。”的场所。分隔器?我不知道这是否是一个可接受的解决方案,我从来没有与其他地区的PHP/MySQL的东西工作。另外可能做所有你的数据库的东西,然后切换到适当的语言环境,当你想输出数据给用户。 – 2012-07-17 10:02:53

+0

http://mark-story.com/posts/view/php-floats-localization-and-landmines虽然我不确定,但这可能有帮助(最后两条评论)。 – 2012-07-17 10:09:12

+0

它已经在一个包装器中了 - 这个问题是我每次PHP构建查询时都必须处理区域设置,而不是在抽象基类中,因为不能保证不会有应用程序代码_should_是使用'nl_NL'发生在构造和破坏数据库包装器之间。 – CD001 2012-07-17 10:10:45

回答

0

解决方案1 ​​

我将张贴我的答案的情况下,这是唯一的解决方案除了@Pete之一。

我建议在每次查询之前将语言环境切换到GB或其他句点分隔的float/double语言环境,然后切换回正确的语言环境。我想不出有什么其他办法。

解决方案2(最佳匹配)

你总是可以使用number_format方法如下

$stringversion = number_format($theFloat, 2, ".",""); 

很肯定这会的工作,该文件是在这里http://php.net/manual/en/function.number-format.php

+0

呵呵 - 如果你完全看完我的问题,你会发现这正是我在做的事......我想知道是否有一个“整洁”的方式:) – CD001 2012-07-17 10:25:17

+0

@ CD001哈哈我发誓我读了不同的方式。我认为你可能有更好的解决方案是非常诚实的。我会继续寻找,但我更喜欢数字格式,而不是本地更改。想象一下,如果GB决定将小数点分隔符更改为“,”,那么您的方法不会有问题,但切换语言环境会。 – 2012-07-17 10:27:02

+0

好 - 我认为普遍的共识是'number_format'可能是最好的方法,所以我会接受这个答案:) – CD001 2012-07-17 10:29:09

0

你可以试试这个或类似的东西吗?感谢卢多维科格罗西

<?php 
setlocale(LC_ALL, 'nl_NL'); 
setlocale(LC_NUMERIC, 'en_GB'); //overwrite the decimal separator 
?> 
+0

仍然是输出的问题,虽然从用户获取他们的页面显示时,他们现在将看到英国分隔符。 – 2012-07-17 10:11:58

+0

@JonTaylor - 你是对的乔恩。如果我不能接受,上面的评论似乎是唯一的答案。或者始终使用number_format ...这相当于同样的事情。 – Pete 2012-07-17 10:15:19

+0

特别是因为应用程序需要输出英国(£x.xx),爱尔兰(€x。xx)和荷兰语(€x,xx)的价格取决于区域设置(使用NumberFormatter和ICU十进制格式完成) - 它在构建SQL查询时需要一个浮点数,用xx的SQL标准表示 - 我不是确定使用'mysqli_stmt :: prepare'这样的东西是否会有所帮助...... – CD001 2012-07-17 10:18:01