4

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

4

4 回答 4

2

使用 PHP,您可以通过转换为浮点数轻松添加 0:

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

这意味着您可以通过以下方式转换您的号码

$row['number'] = (float) $row['number'];

从数据库中获取后。

于 2010-11-26T11:00:00.960 回答
0

除了修改 php/oci-extension 源代码之外,没有办法在全球范围内执行您所要求的操作。这种行为的原因是因为 oracle oci 在结果中省略了 0,而 php 将所有结果从 oci 转换为字符串,而不根据列数据类型执行任何转换。甚至导致 SQL*Plus 默认省略 0,并且必须调用 SQL*Plus 格式set numformat来自定义列格式并添加 0。

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

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

于 2010-11-30T21:09:26.810 回答
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;
}
于 2020-10-27T14:55:40.370 回答
0

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

于 2021-07-29T16:23:31.823 回答