学习PHP中的国际化功能来查看货币及日期信息

做为一门在世界范围内广泛使用的编程语言,国际化能力往往是衡量一个编程语言是否能够大范围流行的重要内容。特别是对于 PHP 这种以 Web 页面编程为主战场的语言来说,国际化能力更是重中之重。在 PHP 中,已经为我们准备好了很多国际化相关的扩展及函数库,今天我们先来简单的学习一下,后面在学习到具体的 国际化与字符编码支持 相关的函数库时再进行深入的讲解学习。

获取当前浏览器用户的所在地

首先,我们来获取当前访问用户的所在地信息,也就是我们常见的 zh-cn 、 en-us 这类的地区语言编码信息。

// $_SERVER['HTTP_ACCEPT_LANGUAGE'] = zh-CN,zh;q=0.9;
$browserLocale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);print_r($browserLocale);
echo '<br/>';
// zh

浏览器传递的这类区域信息是 zh-CN,zh;q=0.9; 这种形式的,我们可以通过 Locale::acceptFromHttp() 获得具体的区域信息。不过需要注意的是,不管是 zh-cn 还是 zh-tw ,返回的都是 zh ,而英文则会返回具体的是 en-us 还是 en-gd 之类的内容,也就是说这个函数对于我们中文语言的结果获取是有问题的。

$locale = ['en', 'fr-FR', 'da, en-gb;q=0.8, en;q=0.7', 'zh-cn', 'zh-tw', 'en-us', 'en-ca', 'ja-jp'];
foreach($locale as $code){print_r(Locale::acceptFromHttp($code));echo '<br/>';
}
// en
// fr_FR
// da
// zh
// zh
// en_US
// en_CA
// ja_JP

我们可以手动来指定区域信息,可以看出除了 zh 之外其它的都是可以获取到正常的具体区域信息的。这点是我们使用这个函数时需要注意的地方。

获取指定地区所在地的标准数字信息

对于我们中国人来,数字比较习惯的是百、千、万位,一般也不太需要区分,而西方国家则喜欢三位一个逗号的分隔开来,也就是对应他们的英文数字习惯,比如 10000,在西方表示中是 10,000 ,英语是 ten thousand , 10000000 表示为 10,000,000 ,英语是 ten million 。因此,在 PHP 中,也是有相对于这种情况的数字表示形式,也就是为普通数字加上逗号以表示西方数字标准格式。

$locale = ['en', 'fr-FR', 'en-gb', 'zh-cn','en-us', 'ko-kr', 'ja-jp'];$money = 1234567.89;foreach($locale as $code){$numberformat = new NumberFormatter($code, NumberFormatter::DECIMAL);echo $code, ":";echo $numberformat->format($money), ', ';echo $numberformat->parse($numberformat->format($money)), '<br/>';
}
// en:1,234,567.89, 1234567.89
// fr-FR:1 234 567,89,
// en-gb:1,234,567.89, 1234567.89
// zh-cn:1,234,567.89, 1234567.89
// en-us:1,234,567.89, 1234567.89
// ko-kr:1,234,567.89, 1234567.89
// ja-jp:1,234,567.89, 1234567.89

我们直接使用 format() 方法,就可以获得指定地区的标准数字表示形式。可以看出亚洲地区的都是和欧美国家相同的,但法国则是使用空格进行分隔的。

获取指定地区所在地的货币符号信息

既然有数字格式的不同了,那么货币形式的区别就也是类似的形式了,只不过我们在使用 NumberFormatter 类的时候需要指定后面的数字类型常量为货币形式 NumberFormatter::PERCENT 。

oreach($locale as $code){$numberformat = new NumberFormatter($code, NumberFormatter::PERCENT);echo $code, ":";echo $numberformat->format($money), '<br/>';
}
// en:¤1,234,567.89
// fr-FR:1 234 567,89 €
// en-gb:£1,234,567.89
// zh-cn:¥1,234,567.89
// en-us:$1,234,567.89
// ko-kr:₩1,234,568
// ja-jp:¥1,234,568

看出来了吗,当指定了货币形式后,format() 出来的结果直接就带上了货币符号。第一个 en 的货币符号其实就是国际通用货币符号,而日元和我们人民币的符号是相同的,这也是一个有趣的历史知识,大家可以自行查询下。

获取指定地区所在地的完整日期

最后就是获取的各地的日期标准格式。其实现在大家通用的都是 yyyy-mm-dd 这种形式来表示日期,不过正式规范的日期标准格式各个地区还是有所不同的。

$date = '2020-09-25 11:05:22';
foreach($locale as $code){$l = new Locale($code);$d = new IntlDateFormatter($code, IntlDateFormatter::FULL, IntlDateFormatter::FULL);$c = IntlCalendar::createInstance(NULL, $code);$c->set('2020', '09', '25', '11', '22', '33');echo $code, ":";echo $d->format($c), "<br/>";
}// en:Friday, September 25, 2020 at 2:48:12 PM China Standard Time
// fr-FR:vendredi 25 septembre 2020 à 14:48:12 heure normale de la Chine
// en-gb:Friday, 25 September 2020 at 14:48:12 China Standard Time
// zh-cn:2020年9月25日星期五 中国标准时间 下午2:48:12
// en-us:Friday, September 25, 2020 at 2:48:12 PM China Standard Time
// ko-kr:2020년 9월 25일 금요일 오후 2시 48분 12초 중국 표준시
// ja-jp:2020年9月25日金曜日 14時48分12秒 中国標準時

是不是很方便,直接就以当地的语言来表示指定地区的标准日期格式了。

总结

对于跨境项目来说,这些功能是非常重要的能力,能够帮助我们快捷地开发或切换相关的地区,等到深入学习的时候再进行详细的学习讲解,这次就全当是一次热身吧!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/11.学习PHP中的国际化功能来查看货币及日期信息.php

参考文档:

《PHP7编程实战》

学习PHP中的国际化功能来查看货币及日期信息相关推荐

  1. NPOI_Excel中设置小数、百分比、货币、日期、科学计数法和金额大写

    NPOI_Excel中设置小数.百分比.货币.日期.科学计数法和金额大写 在操作Excel时候一些特殊值的转换是在所难免的,下面就给出转换方法大同小异,代码如下: HSSFWorkbook hssfW ...

  2. 京东云给新建空间添加用户权限,并在jmr中通过linux/hadoop命令查看对应的文件信息

    之前使用过亚马逊的云服务和阿里云,现在使用京东云,权限配置这一块还是有区别的,做个小记录,yi 以后忘记了就翻一翻. 1.京东云对象存储里面新建空间 2.进入访问控制 3.点击子用户下方数字 4.点击 ...

  3. JavaWeb-综合案例(用户信息)-学习笔记02【登录功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  4. 学习PHP中国际化地数字格式处理

    不知道大家有没有了解过,对于数字格式来说,西方国家会以三位为一个进位,使用逗号来分隔.比如,12345678,用标准的格式来表示的话就是 12,345,678 .不过我们中文其实并不会有这样的分隔符, ...

  5. Kali linux学习入门-Kali菜单中各工具功能

    想要进入安全行业为安全事业做贡献,就要硬着头皮学点什么.就像为什么军人往往都有更高的成就?因为自律.克服玩游戏的欲望吧,踏踏实实学点东西.http://www.cnblogs.com/lsdb/p/6 ...

  6. 字串处理 expr在linux中是一个功能非常强大的命令。通过学习做一个小小的总结。

    expr在linux中是一个功能非常强大的命令.通过学习做一个小小的总结. 1.计算字符串的长度.我们可以用awk中的length(s)进行计算.我们也可以用echo中的echo ${#string} ...

  7. Android 8.0学习(31)---Android 8.0 中的 ART 功能改进

    Android 8.0 中的 ART 功能改进 在 Android 8.0 版本中,Android Runtime (ART) 有了极大改进.下面的列表总结了设备制造商可以在 ART 中获得的增强功能 ...

  8. Java平台,标准版Oracle JDK 9中的新功能

    Java平台,标准版 Oracle JDK 9中的新增功能 版本9 E77563-05 2017年9月 JDK 9中的新功能概述 Java Platform,Standard Edition 9是一个 ...

  9. javascript国际化_如何在JavaScript中实现国际化(i18n)

    javascript国际化 朱利安· 莫茨 ( Julian Motz) , 帕纳约提斯· 维利萨拉科斯 ( Panayiotis Velisarakos) , 菲尔丹 ·史蒂芬 ( Vildan S ...

最新文章

  1. 基本的函数返回值 使用
  2. Android内存管理-OnTrimMemory
  3. 支持向量所在超平面方程_支持向量机通俗导论:理解SVM的三层境界(一)
  4. MongoDB导出csv格式数据
  5. 2-3 人工智能需要的基本数学知识|人工智能框架TensorFlow应用实践
  6. linux 内核入口地址,linux内核的加载地址和入口地址
  7. linux脚本硬盘,Linux mount挂载和卸载硬盘脚本分享
  8. 力扣812.最大三角形面积
  9. 数据库设计 Assignment 02
  10. fortan dll在本地可以运行成功,移植到其他电脑上报错Exception in thread main java.lang.UnsatisfiedLinkError: 找不到指定的模块。
  11. PHP使用MQ消息队列
  12. MATLAB生成M序列和Gold序列
  13. 戴尔服务器2003系统,Dell PowerEdge R710安装Windows2003系统
  14. C++从零开始 一(C++ primer plus 第六版)
  15. python爬虫爬取美丽小姐姐图片美女壁纸
  16. 余压监控系统在高层住宅楼的应用
  17. 雷军:企业如何渡过寒冬?你需要学会这5招
  18. office安装包百度云
  19. SSM源码分析之Spring02-Spring源码分析前瞻
  20. redis指定数据库

热门文章

  1. ES6常用数组去重,数组排序
  2. android修改apk的图标及名称
  3. JSON是什么?如何正确理解?
  4. 本地部署Stable Diffusion教程,亲测可以安装成功
  5. vscode中flake8报错
  6. 安卓apk反编译操作步骤
  7. vimplus的安装和使用
  8. 关于pip install ensemble-boxes报错的处理
  9. 数据管理的三个阶段(人工管理,文件系统,数据库系统)
  10. MySQL中的时间类型