【问题标题】:PHP OCI, Oracle, and default number formatPHP OCI、Oracle 和默认数字格式
【发布时间】:2011-05-16 03:15:20
【问题描述】:

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

【问题讨论】:

标签: php oracle formatting oracle-call-interface


【解决方案1】:

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

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

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

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

从数据库中获取之后。

【讨论】:

  • 感谢您的回答,但我正在寻找一种在全球范围内更改它的方法。我们有许多查询需要更改,这将是太多的努力。
【解决方案2】:

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

目前没有可用于更改此行为的 alter session 参数。

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

【讨论】:

    【解决方案3】:

    如果您需要修复多行中的小数,这里有一个函数来解决它。

    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;
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 1970-01-01
        • 2021-08-28
        • 2015-02-02
        相关资源
        最近更新 更多