2012-07-17 35 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