5

我刚刚注意到,propel 在生成的 setter 方法中将数值转换为字符串。我的问题是,由于我使用的是德语语言环境,浮点值是用逗号而不是点插入的。例如:“3.5”生成字符串“3,5”。我正在使用 PostgreSQL,它显然需要 3.5。

版本信息: 如果相关,我使用的是: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"

我花了一段时间才找到发生这种转换的地方。如您所见,浮点值在 setAmount() 中被转换为字符串。到目前为止,我从未注意到将浮点值转换为字符串会导致字符串包含特定于语言环境的小数分隔符。

我想知道为什么推进首先将浮点值转换为字符串?有一些解决方法吗?

我想出的唯一解决方法是非常丑陋和烦人:

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

1 回答 1

5

问题是 Propel 将与该列相关的 PHP 字段转换为 setter 中的本机 PHP 类型(正如@j0k 所提到的),但是如果您看得更深一点,就会发现问题。在PropelTypes.php助手类中,在第 76 行,您可以看到“十进制”的原生 PHP 类型被列为“字符串”。

将此与列为“double”的“float”本机类型进行比较。我不确定这是否是故意的,但无论如何,只需将列切换到type="float"or即可解决您的问题type="double"

Propel 应该将其转换为您的 DBMS 需要的任何类型。

于 2013-03-26T14:36:07.330 回答