2013-03-26 125 views
5

我剛剛注意到,這個propel將數值轉換爲生成的setter方法中的字符串。 我的問題是,因爲我使用的是德語語言環境,所以浮動值插入時用逗號而不是點。例如:「3.5」產生一個字符串「3,5」。 我使用的PostgreSQL,顯然預計3.5。爲什麼propel會將float屬性轉換爲字符串?

版本信息: 如果相關,我使用:PHP 5.3.9,Propel 1.6和Symfony 2.2。

詳細說明:

表定義看起來像這樣:

<table name="account_entry"> 
    ... 
    <column name="amount" type="decimal" size="12" scale="2" required="true" /> 
    ... 
</table> 

生成setAmount()方法是這樣的:

public function setAmount($v) 
{ 
    if ($v !== null && is_numeric($v)) { 
     $v = (string) $v; 
    } 

    if ($this->amount !== $v) { 
     $this->amount = $v; 
     $this->modifiedColumns[] = AccountEntryPeer::AMOUNT; 
    } 


    return $this; 
} // setAmount() 

在一個PostgreSQL保存對象的結果錯誤:

Invalid text representation: 7 ERROR: invalid input syntax for type numeric: "3,5" 

我花了一段時間才找到發生這種轉換的地方。正如你所看到的,float值正在被轉換爲setAmount()中的字符串。到目前爲止,我從未注意到將一個浮點值轉換爲字符串會導致包含特定於語言環境的小數點分隔符的字符串。

我想知道爲什麼propel首先將float值轉換爲字符串? 有沒有一些解決方法呢?

我想出的唯一解決方法是非常醜陋和討厭:

setlocale(LC_ALL, 'en_US'); 
$ae->setAmount(3.5); 
setlocale(LC_ALL, 'de_DE'); 
+0

它似乎是[*默認*行爲](https://github.com/propelorm/Propel/blob/master/generator/lib/builder/om/PHP5ObjectBuilder.php#L1844-1873)來處理柱。但根據SQL的生成方式(例如插入),[看起來](https://github.com/propelorm/Propel/blob/master/generator/lib/builder/sql/DataSQLBuilder.php#L172 -180),它應該被鑄造*再次*以匹配本地列類型。您可以檢查[Github上的問題](https://github.com/propelorm/Propel/issues)和/或提交一個 – j0k 2013-03-26 08:57:52

+0

感謝您的研究。我在推送郵件列表上發佈了這個問題。我想避免創建錯誤報告,如果它可能不是一個錯誤。 – Leif 2013-03-26 09:44:46

回答

5

的問題是,波輪轉換,涉及到該列到二傳手PHP原生類型的PHP領域(如@ j0k提到),但如果你看得更深一點,你會看到這個問題。在第76行的PropelTypes.php助手類中,您可以看到「decimal」的原生PHP類型被列爲「string」。

將此與「double」列出的「float」本機類型進行比較。我不確定這是否有意或無意,但無論如何,只需將列轉換爲type="float"type="double"即可解決問題。

Propel應該將其轉換爲您的DBMS需要的任何類型。

+0

謝謝!將類型從小數更改爲double確實可以解決我的問題。我仍然認爲這是一種解決方法,因爲PostgreSQL現在使用double作爲類型,而不是decimal(x,y)。但對我的情況來說這很好。 – Leif 2013-03-26 17:06:35

+0

很高興它的工作。我真的不知道爲什麼核心Propel人會默認本機類型爲「字符串」,但是對於某些DBMS也許是有意義的。 – jakerella 2013-03-26 18:19:03

+3

這是因爲數據庫中的DECIMAL字段是精確的,而CPU上的本機浮點處理不是。因此,Propel通過返回字符串中的確切值來安全起作用,並讓您擔心算術和存儲。見f.e. [鏈接](http://msdn.microsoft.com/en-us/library/c151dt3s%28v=vs.80%29.aspx) – Noora 2013-05-30 11:36:32

相關問題