2013-03-26 5 views
5

私は気づいたばかりですが、そのプロペラは生成されたセッターメソッドで数値を文字列に変換します。 私はドイツ語のロケールを使用しているので、浮動小数点値はドットの代わりにコンマで挿入されています。たとえば、「3.5」の場合、文字列「3,5」になります。 PostgreSQLを使用していますが、明らかに3.5が必要です。propelがfloatプロパティをstringに変換するのはなぜですか?

バージョン情報:それは関連性がある場合には 、私が使用しています: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が浮動小数点値を最初の文字列に変換するのはなぜですか? これにはいくつかの回避策がありますか?

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 on issue](https://github.com/propelorm/Propel/issues)をチェックしたり、 – j0k

+0

を提出してもらうことができます。私はpropelメーリングリストに質問を掲載しました。私はバグではないかもしれない場合、バグレポートを作成しないようにしたい。 – Leif

答えて

5

問題はPropelは@ j0kとして(セッターでネイティブのPHP型にその列に関連するPHPフィールドを変換していることである:

私が思いついた唯一の回避策は、本当に醜いと迷惑ですあなたが少し深く見える場合、あなたはその問題を見る。 PropelTypes.phpヘルパークラスの76行目では、 "decimal"のネイティブPHPタイプが "string"としてリストされていることがわかります。

"double"としてリストされている "float"ネイティブタイプと比較してください。これが意図的なのかどうかはわかりませんが、いずれの場合でも、列をtype="float"またはtype="double"に切り替えるだけで問題が解決する可能性があります。

Propelは、DBMSに必要なすべてのタイプに変換する必要があります。

+0

ありがとう! 10進数から2倍にタイプを変更することは、実際に私の問題を解決します。 PostgreSQLはdecimal(x、y)ではなくdouble型を使用しているので、まだ解決策として考えています。しかし、これは私の場合には問題ありません。 – Leif

+0

それはうまくいった。私は正直なところ、なぜPropelの中核がネイティブタイプを "文字列"にデフォルト化したのかは分かりませんが、DBMSの中には意味があるかもしれません。 – jakerella

+3

データベースのDECIMALフィールドは正確ですが、CPUのネイティブ浮動小数点処理は正確ではありません。したがって、Propelは文字列の正確な値を返すことで安全に演奏し、算術と記憶を心配します。 f.e.を参照のこと。 [リンク](http://msdn.microsoft.com/en-us/library/c151dt3s%28v=vs.80%29.aspx) – Noora

関連する問題