PHP OCI、Oracle 和默认数字格式

发布于 2024-10-04 04:03:13 字数 190 浏览 8 评论 0原文

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

When I execute a fetch from an Oracle database using PHP OCI, numbers that are less than 1 are shown as .XXXXXX, e.g. .249999. Is there a way to set this to 0.XXXXXX or to any other format, without modifying every query to use to_char() explicitly? (Perhaps through some session parameters?)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

为你拒绝所有暧昧 2024-10-11 04:03:13

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

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

这意味着您可以

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

在从数据库获取数字后转换您的数字。

Using PHP you can easily add the 0, by converting to float:

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

Meaning you can convert your number by

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

after fetching it from the DB.

橪书 2024-10-11 04:03:13

如果不修改 php/oci-extension 源代码,就无法完成您在全球范围内提出的要求。出现此行为的原因是因为 oracle oci 在结果中省略了 0,而 php 将所有结果从 oci 转换为字符串,而不根据列数据类型执行任何转换。即使 SQL*Plus 中的结果默认情况下也会省略 0,并且必须使用 set numformat 调用 SQL*Plus 格式来自定义列格式并在前面添加 0。

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

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

There is no way to do what you're asking globally short of modifying php/oci-extension source code. The reason for this behavior is because oracle oci omits 0s in results and php converts all results from oci to strings without performing any casting depending on column datatype. Even results in SQL*Plus omit 0 by default, and SQL*Plus formatting has to be invoked with set numformat to customize column formatting and prepend 0s.

There is currently no alter session parameter you can set to change this behavior.

Most common way to work around this is to use a wrapper around your queries and check for numeric columns with is_numeric and then format the numeric column values with number_format or sprintf. Hopefully your application already uses a wrapper around stock php oci functions so you can make the change in one location.

九歌凝 2024-10-11 04:03:13

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

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

If you need to fix decimals numbers in multiple rows, here's a function to solve it.

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;
}
長街聽風 2024-10-11 04:03:13

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

The simplest option
$a = '.249999';
echo ($a*1);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文