PHP中number_format函数输出数字格式化,增加千分位符号

 更新时间:2016年11月25日 16:45  点击:1635
下文给各位介绍一个PHP中number_format函数输出数字格式化,增加千分位符号,如果有需要的朋友可一起来看看.

在输出数据到屏幕上显示的时候,如果数据较大,位数较多,看上去会比较费劲,有一种比较直观的方法是使用千分位,也就是每三位数字显示一个逗号,这样可以快速的知道数的大小,不用一位位的去慢慢数了。

令人高兴的是,php中有专门的函数可以完成这个任务,可以在输出数据的时候自动加上千分位。

string number_format ( float number [, int decimals [, string dec_point, string thousands_sep]] )

number_format有四个参数,第一个参数是要输出的数字(浮点类型),这个参数是必需的,后面三个参数为可选的,其中后面两个参数要么全没有,要么全提供

number      必需。要格式化的数字。如果未设置其他参数,则数字会被格式化为不带小数点且以逗号 (,) 作为分隔符。

decimals    可选。规定多少个小数。如果设置了该参数,则使用点号 (.) 作为小数点来格式化数字。

decimalpoint    可选。规定用作小数点的字符串。

separator    可选。规定用作千位分隔符的字符串。仅使用该参数的第一个字符。比如 “xyz” 仅输出 “x”。

string number_format(
  float number,  //要输出的数字
  int decimals,  //小数位的位数,默认为0
  string dec_point, //小数点的表示,默认为.
  string thousands_sep //千分位的表示,默认为,
)

下面搞个例子试试

echo number_format('1234.56');
echo number_format('1234.56',1);
echo number_format('1234.56',2);
echo number_format('1234.56',3);
echo number_format('1234.56',2,'-','/');

结果如下

1,235   // 四舍五入
1,234.6   //
1,234.56  //
1,234.560  // 小数位不足,补充0
1/234-56  // 千分位符号变成/,小数点符号变为-

例子

number_format

<?php

$number = 1234.56;

// english notation (default)
$english_format_number = number_format($number);
// 1,235

// French notation
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56

$number = 1234.5678;

// english notation without thousands seperator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

?>

在做文件上传时有一个非常必须要做的功能就是上传文件会按日期生成目录并把文件保存在目录下了,下面我来为各位介绍一段php自动创建目录并保存文件函数

php保存文件,还可以根据文件路径自动连续创建目录,代码如下(注:PHP要版本5以上):

<?php
 /**
  * 保存文件
  *
  * @param string $fileName 文件名(含相对路径)
  * @param string $text 文件内容
  * @return boolean
  */
 function saveFile($fileName, $text) {
  if (!$fileName || !$text)
   return false;
  if (makeDir(dirname($fileName))) {
   if ($fp = fopen($fileName, "w")) {
    if (@fwrite($fp, $text)) {
     fclose($fp);
     return true;
    } else {
     fclose($fp);
     return false;
    }
   }
  }
  return false;
 }
 /**
  * 连续创建目录
  *
  * @param string $dir 目录字符串
  * @param int $mode 权限数字
  * @return boolean
  */
 function makeDir($dir, $mode=0755) {
   /*function makeDir($dir, $mode="0777") { 此外0777不能加单引号和双引号,
  加了以后,"0400" = 600权限,处以为会这样,我也想不通*/
  if (!dir) return false;
  if(!file_exists($dir)) {
   return mkdir($dir,$mode,true);
  } else {
   return true;
  }
 }
?>
//以下是测试内容,并调用上面的函数
<?php
 $content = '这里是测试内容';
 if(saveFile('dir/test.txt',$content)){
  echo '写入成功';
 }else{
  echo '写入失败';
 }
?>

注意:makeDir就是一个目录创建函数,我们使用的是递归创建了.

记得以前的港片《杀手之王》有一个镜头,就是用计算机判断一个照片和杀手留下的背影照片的相似度,现在我们来分享一个PHP简单的图片相似度比较类。

由于相似图片搜索的php实现的 API 不怎么符合我的用途,所以我重新定义 API 的架构,改写成比较简单的函数方式,虽然还是用对象的方式包装。

 代码如下 复制代码
<?php   
/**  
* 图片相似度比较  
*  
* @version     $Id: ImageHash.php 4429 2012-04-17 13:20:31Z jax $  
* @author      jax.hu  
*  
* <code>  
*  //Sample_1  
*  $aHash = ImageHash::hashImageFile('wsz.11.jpg');  
*  $bHash = ImageHash::hashImageFile('wsz.12.jpg');  
*  var_dump(ImageHash::isHashSimilar($aHash, $bHash));  
*  
*  //Sample_2  
*  var_dump(ImageHash::isImageFileSimilar('wsz.11.jpg', 'wsz.12.jpg'));  
* </code>  
*/   
   
class ImageHash {   
   
   /**取样倍率 1~10  
    * @access public  
    * @staticvar int  
    * */   
   public static $rate = 2;   
   
   /**相似度允许值 0~64  
    * @access public  
    * @staticvar int  
    * */   
   public static $similarity = 80;   
   
   /**图片类型对应的开启函数  
    * @access private  
    * @staticvar string  
    * */   
   private static $_createFunc = array(   
       IMAGETYPE_GIF   =>'imageCreateFromGIF',   
       IMAGETYPE_JPEG  =>'imageCreateFromJPEG',   
       IMAGETYPE_PNG   =>'imageCreateFromPNG',   
       IMAGETYPE_BMP   =>'imageCreateFromBMP',   
       IMAGETYPE_WBMP  =>'imageCreateFromWBMP',   
       IMAGETYPE_XBM   =>'imageCreateFromXBM',   
   );   
   
   
   /**从文件建立图片  
    * @param string $filePath 文件地址路径  
    * @return resource 当成功开启图片则传递图片 resource ID,失败则是 false  
    * */   
   public static function createImage($filePath){   
       if(!file_exists($filePath)){ return false; }   
   
       /*判断文件类型是否可以开启*/   
       $type = exif_imagetype($filePath);   
       if(!array_key_exists($type,self::$_createFunc)){ return false; }   
   
       $func = self::$_createFunc[$type];   
       if(!function_exists($func)){ return false; }   
   
       return $func($filePath);   
   }   
   
   
   /**hash 图片  
    * @param resource $src 图片 resource ID  
    * @return string 图片 hash 值,失败则是 false  
    * */   
   public static function hashImage($src){   
       if(!$src){ return false; }   
   
       /*缩小图片尺寸*/   
       $delta = 8 * self::$rate;   
       $img = imageCreateTrueColor($delta,$delta);   
       imageCopyResized($img,$src, 0,0,0,0, $delta,$delta,imagesX($src),imagesY($src));   
   
       /*计算图片灰阶值*/   
       $grayArray = array();   
       for ($y=0; $y<$delta; $y++){   
           for ($x=0; $x<$delta; $x++){   
               $rgb = imagecolorat($img,$x,$y);   
               $col = imagecolorsforindex($img, $rgb);   
               $gray = intval(($col['red']+$col['green']+$col['blue'])/3)& 0xFF;   
   
               $grayArray[] = $gray;   
           }   
       }   
       imagedestroy($img);   
   
       /*计算所有像素的灰阶平均值*/   
       $average = array_sum($grayArray)/count($grayArray);   
   
       /*计算 hash 值*/   
       $hashStr = '';   
       foreach ($grayArray as $gray){   
           $hashStr .= ($gray>=$average) ? '1' : '0';   
       }   
   
       return $hashStr;   
   }   
   
   
   /**hash 图片文件  
    * @param string $filePath 文件地址路径  
    * @return string 图片 hash 值,失败则是 false  
    * */   
   public static function hashImageFile($filePath){   
       $src = self::createImage($filePath);   
       $hashStr = self::hashImage($src);   
       imagedestroy($src);   
   
       return $hashStr;   
   }   
   
   
   /**比较两个 hash 值,是不是相似  
    * @param string $aHash A图片的 hash 值  
    * @param string $bHash B图片的 hash 值  
    * @return bool 当图片相似则传递 true,否则是 false  
    * */   
   public static function isHashSimilar($aHash, $bHash){   
       $aL = strlen($aHash); $bL = strlen($bHash);   
       if ($aL !== $bL){ return false; }   
   
       /*计算容许落差的数量*/   
       $allowGap = $aL*(100-self::$similarity)/100;   
   
       /*计算两个 hash 值的汉明距离*/   
       $distance = 0;   
       for($i=0; $i<$aL; $i++){   
           if ($aHash{$i} !== $bHash{$i}){ $distance++; }   
       }   
   
       return ($distance<=$allowGap) ? true : false;   
   }   
   
   
   /**比较两个图片文件,是不是相似  
    * @param string $aHash A图片的路径  
    * @param string $bHash B图片的路径  
    * @return bool 当图片相似则传递 true,否则是 false  
    * */   
   public static function isImageFileSimilar($aPath, $bPath){   
       $aHash = ImageHash::hashImageFile($aPath);   
       $bHash = ImageHash::hashImageFile($bPath);   
       return ImageHash::isHashSimilar($aHash, $bHash);   
   }   
   
}
require() 语句包含并运行指定文件,include()语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。这两个函数有相似的功能,现在我们来讲讲他们包含文件的路径问题。

1 绝对路径、相对路径和未确定路径

相对路径

相对路径指以.开头的路径,例如

./a/a.php (相对当前目录)

../common.inc.php (相对上级目录),

绝对路径

绝对路径是以 / 开头或者windows下的 C:/ 类似的盘符开头的路径,全路径不用任何参考路径就可以唯一确定文件的最终地址。 例如

/apache/wwwroot/site/a/a.php

c:/wwwroot/site/a/a.php

未确定路径

凡是不以 . 或者 / 开头、也不是windows下 盘符:/ 开头的路径,例如

a/a.php

common.inc.php,

开始以为这也是相对路径,但在php的include/require包含机制中,这种类型的路径跟以 . 开头的相对路径处理是完全不同的。require './a.php' 和 require 'a.php' 是不同的!

下面分析这三种类型包含路径的处理方式:首先记住一个结论:如果包含路径为相对路径或者绝对径,则不会到include_path(php.ini 中定义的include_path环境变量,或者在程序中使用set_include_path(...)设置)中去查找该文件。

测试环境说明

注意:下面的讨论和结论基于这样的环境: 假设 A=http://www.xxx.com/app/test/a.php,再次强调下面的讨论是针对直接访问A的情况。

2. 相对路径:

相对路径需要一个参考目录才能确定文件的最终路径,在包含解析中,不管包含嵌套多少层,这个参考目录是程序执行入口文件所在目录。

示例1

A中定义 require './b/b.php'; // 则B=[SITE]/app/test/b/b.php

B中定义 require './c.php'; // 则C=[SITE]/app/test/c.php 不是[SITE]/app/test/b/c.php

示例2

A中定义 require './b/b.php'; // 则B=[SITE]/app/test/b/b.php

B中定义 require '../c.php'; // 则C=[SITE]/app/c.php 不是 [SITE]/app/test/c.php

示例3

A中定义 require '../b.php'; //则B=[SITE]/app/b.php

B中定义 require '../c.php'; //则C=[SITE]/app/c.php 不是 [SITE]/c.php

示例4:

A中定义 require '../b.php'; // 则B=[SITE]/app/b.php

B中定义 require './c/c.php'; / /则C=[SITE]/app/test/c/c.php 不是 [SITE]/app/c/c.php

示例5

A中定义 require '../inc/b.php'; // 则B=[SITE]/app/inc/b.php

B中定义 require './c/c.php'; // 则C还是=[SITE]/app/test/c/c.php 不是 [SITE]/app/inc/c/c.php

示例6

A中定义 require '../inc/b.php'; // 则B=[SITE]/app/inc/b.php

B中定义 require './c.php'; // 则C=[SITE]/app/test/c.php 不是 [SITE]/app/inc/c.php

3. 绝对路径

绝对路径的比较简单,不容易混淆出错,require|inclue 的就是对应磁盘中的文件。

require '/wwwroot/xxx.com/app/test/b.php'; // Linux中

require 'c:/wwwroot/xxx.com/app/test/b.php'; // windows中

dirname(__FILE__)计算出来的也是一个绝对路径形式的目录,但是要注意__FILE__是一个Magic constants,不管在什么时候都等于写这条语句的php文件所在的绝对路径,因此dirname(__FILE__)也总是指向写这条语句的php文件所在的绝对路径,跟这个文件是否被其他文件包含使用没有任何关系。

示例1

A中定义 require '../b.php'; // 则B=[SITE]/app/b.php

B中定义 require dirname(__FILE__).'/c.php'; // 则B=[SITE]/app/c.php

示例2

A中定义 require '../inc/b.php'; // 则B=[SITE]/app/inc/b.php

B中定义 require dirname(__FILE__).'/c.php'; // 则B=[SITE]/app/inc/c.php 始终跟B在同一个目录

结论:不管B是被A包含使用,还是直接被访问

B如果 require dirname(__FILE__).'/c.php'; // 则始终引用到跟B在同一个目录中的 c.php文件;

B如果 require dirname(__FILE__).'/../c.php'; // 则始终引用到B文件所在目录的父目录中的 c.php文件;

B如果 require dirname(__FILE__).'/c/c.php'; // 则始终引用到B文件所在目录的c子目录中的 c.php文件;

4. 未确定路径

首先在逐一用include_path中定义的包含目录来拼接[未确定路径],找到存在的文件则包含成功退出,如果没有找到,则用执行 require语句的php文件所在目录来拼接[未确定路径]组成的全路径去查找该文件,如果文件存在则包含成功退出,否则表示包含文件不存在,出错。 未确定路径比较容易搞混不建议使用。

5. 解决方案

由于“相对路径”中的“参照目录”是执行入口文件所在目录,“未确定”路径也比较容易混淆,因此最好的解决方法是使用“绝对路径”; 例如b.php的内容如下,无论在哪里require b.php都是以b.php的路径为参照来require c.php的

$dir = dirname(__FILE__);

require($dir . '../c.php');

或者定义一个通用函数 import.php,将其设置为“自动提前引入文件”,在php.ini做如下配置

更改配置项(必须)auto_prepend_file = "C:xampphtdocsauto_prepend_file.php"

更改配置项(可选)allow_url_include = On

import.php内容如下

function import($path) {

$old_dir = getcwd(); // 保存原“参照目录”

chdir(dirname(__FILE__)); // 将“参照目录”更改为当前脚本的绝对路径

require_once($path);

chdir($old_dir); // 改回原“参照目录”

}

这样就可以使用import()函数来require文件了,无论包含多少级“参照目录”都是当前文件

网站文件上传安全性不容忽视,我们第一步验证就是限制上传扩展名,只能上传我们规定的文件扩展名,现在我们用php的ereg来验证上传文件。

ereg格式如下:

 代码如下 复制代码
ereg(正规表达式,字符串,[匹配部分数组名]);

 这里利用了ereg来验证用户上传的文件类型与文件名是否是符合文件命名规则,实例代码如下:

 代码如下 复制代码
if( !is_uploaded_file($upfile) )
 {
  echo("你什么都没有上传哦!");
  exit();
 }
 else
 {
  if( !ereg(".(htm|html)$", $upfile_name) )
  {
   echo("dedecms模板只能用 .htm 或 .html扩展名!");
    exit();
  }
  if( ereg("[/]",$upfile_name) )
  {
   echo("模板文件名有非法字符,禁止上传!-1");
    exit();
  }
  move_uploaded_file($upfile, $templetdird.'/'.$upfile_name);
  @unlink($upfile);
  echo("成功上传一个文件!");
  exit();
 }
 exit();

现在我们只是讲了验证上传的文件名是否合法,以后的教程我们会继续讲怎么判断上传的内容是否安全。

[!--infotagslink--]

相关文章