如何为CSV导出中的数字指定小数和千位分隔符?

时间:2018-01-03 17:56:40

标签: php csv

     $num_column = mysql_num_fields($view); 
     $csv_header = '';
     for($i = 0; $i < $num_column; $i++) {
         $csv_header .= '"' . mysql_field_name($view,$i) . '";';
     }  
     $csv_header .= "\r\n";

     $csv_row = '';   
     while($row = mysql_fetch_row($view)) {
         for($i = 0; $i < $num_column; $i++) {
            $csv_row .= '"' . $row[$i] . '";';
        }
        $csv_row .= "\r\n";
     }

我目前正在PHPMyadmin上的存储过程中创建一个CSV文件。 这是我创建导出文件的代码段。

我希望将小数分隔符用作逗号,例如(1,45)和千位分隔符作为小数点,例如(14.124)。

我知道number_format函数,但我不确定如何将它应用于我生成的CSV导出中的所有数字。

1 个答案:

答案 0 :(得分:1)

我将假设您希望在PHP中而不是在存储过程中执行此操作。

首先要做的事情是:不要使用mysql_ *函数。它们在PHP 5中被弃用,并且在PHP 7中被完全删除 - 这是有充分理由的。查看mysqli或PDO。如果您不熟悉PHP中的OOP,它可能看起来有点令人困惑,但它与mysql_ *函数实际上并没有太大区别。

除此之外,我建议在输出时通过函数运行每个值。您可以将该函数格式设置为看起来像数字的任何内容,或者使用白名单来格式化您知道数字的特定列。

以下是全包功能示例 - 您可以将其修剪为您需要的功能。它允许您传递要格式化的值,以及列名的可选参数,以及应格式化为数字的列数组的另一个可选参数。

function format_number_output ($val, $col=false, $whitelist=array())
{
    // First, check if the column name was passed
    if ($col !== false && count($whitelist) > 0)
    {
        // Is this one of the columns that should be formatted?
        if (in_array($col, $whitelist) && is_numeric($val))
        {return number_format($val, 2, ',', '.');}
        // If not, then just return the original value
        else
        {return $val;}
    }

    // If the column name was not passed, then format anything that looks like a number
    else if (is_numeric($val))
    {return number_format($val, 2, ',', '.');}

    // Otherwise, just return the original value
    else
    {return $val;}
}

你可以用不同的选项测试它:

// Returns "1234.56":
print format_number_output("1234.56", "actually_text", array("numeric_field", "another_numeric")); 
// Returns "1.234,56":
print format_number_output("1234.56", "numeric_field", array("numeric_field", "another_numeric")); 
// Returns "text":
print format_number_output("text", "numeric_field", array("numeric_field", "another_numeric")); 
// Returns "1.234,56":
print format_number_output("1234.56"); 
// Returns "text":
print format_number_output("text"); 

此外,我强烈建议您接受GrumpyCrouton的建议并使用fputcsv。 CSV格式有许多你不想处理的愚蠢的小问题。

你可以修改你的代码让它像这样工作(我已经离开了你的mysql_fetch_array调用 - 但是再次,在你的项目变大并且重构变得困难之前,学会尽快使用PDO / mysqli):

$fp = fopen("output.csv", "w");
while($row = mysql_fetch_row($view)) {
    $cur_row = array();
    for($i = 0; $i < $num_column; $i++) {
        $cur_row[] = format_number_output($row[$i]);
    }
    fputcsv($fp, $cur_row);
}
fclose($fp)

如果你想使用白名单方法,你可以使用mysql_fetch_array(或者更确切地说 - 相当于PDO / mysqli)获取列名:

$fp = fopen("output.csv", "w");
while($row = mysql_fetch_array($view)) {
    $cur_row = array();
    foreach ($row as $col=>$val) {
        $cur_row[] = format_number_output($val, $col, array("numeric_field", "another_numeric_field"));
    }
    fputcsv($fp, $cur_row);
}
fclose($fp)