PHP OCI,Oracle和默认数字格式

时间:2010-11-26 10:45:35

标签: php oracle formatting oci

当我使用PHP OCI从Oracle数据库执行提取时,小于1的数字显示为.XXXXXX,,例如.249999。有没有办法将其设置为0.XXXXXX或任何其他格式,而无需修改每个查询以明确使用to_char()? (也许通过一些会话参数?)

4 个答案:

答案 0 :(得分:2)

使用PHP,您可以通过转换为float来轻松添加0:

$a = '.249999';
echo (float) $a;

意味着您可以通过

转换您的号码
$row['number'] = (float) $row['number'];
从数据库中取出后

答案 1 :(得分:0)

除了修改php / oci-extension源代码之外,没有办法做你所要求的全局。这种行为的原因是因为oracle oci在结果中省略了0并且php将所有结果从oci转换为字符串而不执行任何转换,具体取决于列数据类型。默认情况下,SQL * Plus中的结果甚至会省略0,并且必须使用set numformat调用SQL * Plus格式以自定义列格式并添加0。

目前没有可以设置的alter session参数来更改此行为。

解决此问题的最常见方法是使用查询包装器并检查is_numeric的数字列,然后使用number_formatsprintf格式化数字列值。希望你的应用程序已经使用了一个围绕库存php oci函数的包装器,这样你就可以在一个位置进行更改。

答案 2 :(得分:0)

如果您需要在多行中固定小数位数,可以使用以下函数来解决。

function fixDecimalNumbers(array $fetchedDataset)
{
    //workaround for Oracle driver not returning leading zero on decimal numbers between -1 and 1 -.-
    foreach($fetchedDataset as $rownum => $row){
        foreach($row as $column => $value) {
            if(substr( $value, 0, 2 ) === '-,' && is_numeric(substr( $value, 2, 1 ))){
                $row[$column] = '-0' . substr( $value, 1);
                error_log($column);
                error_log($value);
            }
            else if(substr( $value, 0, 1 ) === ',' && is_numeric(substr( $value, 1, 1 ))){
                $row[$column] = '0' . $value;
            }
        }
        $fetchedDataset[$rownum] = $row;
    }
    return $fetchedDataset;
}

答案 3 :(得分:0)

最简单的选择 $a = '.249999'; 回声 ($a*1);