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); } } |
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(); |
现在我们只是讲了验证上传的文件名是否合法,以后的教程我们会继续讲怎么判断上传的内容是否安全。
相关文章
- 这篇文章主要介绍了解决Pycharm 运行后没有输出的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-06
SQL Server中row_number函数的常见用法示例详解
这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08- 这篇文章主要介绍了VSCode格式化JS自动添加或去掉分号的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-10-12
- 这篇文章主要为大家详细介绍了C#格式化数字字符串的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了prettier自动格式化去换行的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-26
微信小程序 时间格式化(util.formatTime(new Date))详解
这篇文章主要介绍了微信小程序 时间格式化(util.formatTime(new Date))详解的相关资料,这里附实例,一目了然很容易解决,需要的朋友可以参考下...2016-11-22- 这篇文章主要介绍了cmd命令的重定向输出 2>&1详解,需要的朋友可以参考下...2020-08-28
- 这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
- 这里分享一个常用的价格格式化的一个方法,在电商的价格处理中非常的实用,具体实现代码大家参考下本文...2017-05-27
- 本文通过一个简单的代码给大家介绍C# 输出字符串到文本文件中,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
- 这篇文章主要介绍了Python如何输出警告信息,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-30
- perl从文件中读取数据并输出,附一个蛋白质序列的读取,有需要的朋友可以参考下...2020-06-29
- 这篇文章主要介绍了python系统指定文件的查找只输出目录下所有文件及文件夹,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-22
- 这篇文章主要介绍了C#小数点格式化用法,结合实例形式分析了C#小数点格式化运算的常用函数与相关使用技巧,需要的朋友可以参考下...2020-06-25
详解PyQt5中textBrowser显示print语句输出的简单方法
这篇文章主要介绍了详解PyQt5中textBrowser显示print语句输出的简单方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-07- 本文介绍了php输出全部gb2312编码内的汉字方法,非常实用,有兴趣的同学可以参考一下 php输出全部gb2312编码内的汉字,$area表示分区,$pos表示分区内所在位置。 代码...2017-07-06
- 下面小编就为大家分享一篇c#实现输出的字符靠右对齐的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
- 今天小编就为大家分享一篇Tensorflow读取并输出已保存模型的权重数值方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看不看...2020-04-30
- 今天小编就为大家分享一篇python Popen 获取输出,等待运行完成示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06
C++输入一个字符串,把其中的字符按照逆序输出的两种方法解析
以下是对C++中输入一个字符串,把其中的字符按照逆序输出的两种方法进行了详细的分析介绍,需要的朋友可以过来参考下...2020-04-25