PHP-Intl 对于 PHP V7.0.20 的行为有所不同

2024-03-26

我有以下代码:

$lang="de-AT";
$currency="3333";
$formatter = new NumberFormatter($lang, NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2);

echo $formatter->format($currency);

可以通过复制/粘贴在此处运行:在线PHP http://www.writephponline.com/(虽然我不知道这个网站的php版本)

其输出:3.333这正是我所期望的。

But on my local host with PHP 7.0.20 and PHPUnit 6.2.1 the Unit test gives me as result: 3 333. phpunit output

知道有什么新内容或为什么吗?


您在此处看到的区域设置 de-AT 的差异:

3.333

and

3 333

只是单纯的字符串比较,是有区别的。

对于书面语言来说,没有。两种形式在该区域设置中都是正确的,并显示same number.

但是,您希望更明确地进行配置,为此,命令数字格式化程序使用点“.”。作为千位分隔符(而不是使用编译的语言环境信息):

$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '.');

配置数据

根本原因是实际代码旁边的 PHP intl 扩展附带了语言数据(来自 CLDR 项目),其中包含符号和规则形式的格式化信息。这意味着,即使扩展版本相同,格式也可能会改变(正如您在 Phpunit 测试中发现的那样)。衍生的从你的例子来看 https://3v4l.org/3R1VA:

  • hhvm-3.15.4 - 3.19.0、7.2.0alpha1 的输出

    3.333 1.1.0

  • 5.6.0 - 5.6.30、7.0.0 - 7.1.6 的输出

    3 333 1.1.0

导致空格而不是点的行是:

http://unicode.org/cldr/trac/browser/trunk/common/main/de_AT.xml#L120 http://unicode.org/cldr/trac/browser/trunk/common/main/de_AT.xml#L120(@13494)

具体变化:

http://unicode.org/cldr/trac/changeset/11798/trunk/common/main/de_AT.xml http://unicode.org/cldr/trac/changeset/11798/trunk/common/main/de_AT.xml

以前,数字组符号是从具有点的父语言环境中接管的。

这是在 Changeset 11798 Timestamp: 07/13/15 12:38:02 (2 年前) - 发布需要时间,所以这就是为什么你只在库的后续版本中看到它。

我只能强调一点,这是配置数据。

处理(单元)测试中的配置

在单元测试中,您通常不想对此进行测试。在配置测试中,您可能想要对此进行测试。您的 Phpunit 测试确实表明您到目前为止的期望不再符合。因此,这可能需要更改代码(即使您的配置期望再次起作用)或更改测试,因为您正在测试特定于区域设置的配置,您可能不是您想要的。

从你的问题我可以想象两者都是可能的。最后,测试反映了您的期望,并且可能揭示了隐藏的依赖关系,这里是区域设置配置数据。

修复方法只需将语言环境切换为“de“ 代替 ”de-AT": https://3v4l.org/hB15n https://3v4l.org/hB15n

  • 5.6.0 - 5.6.30、hhvm-3.15.4 - 3.19.0、7.0.0 - 7.2.0alpha1 的输出

    3.333 1.1.0

但请记住,这也会隐藏您可能测试错误的潜在问题。因此,最好将失败的测试作为记录,询问自己的期望以及代码是否符合您编写的目的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP-Intl 对于 PHP V7.0.20 的行为有所不同 的相关文章

  • 在PHP中引用容器对象的方法?

    PHP 中给出以下内容
  • regex php - 查找 div 中具有特定 ID 的内容

    我确信这是一个简单的问题 尽管我在谷歌上进行了如此多的搜索和搜索 但我似乎无法弄清楚这有什么问题 我在此页面上的其他区域使用类似的表达式来准确返回我想要的内容 但是 我无法让这个特定的位返回我想要的东西 所以也许有人可以帮助我 我有一个带有
  • 限制 WooCommerce 上的域名注册

    如何限制用户电子邮件对 WooCommerce 注册中特定域的访问 我发现这段代码可以做到这一点 但由于某种原因它在 WooCommerce 注册表单上不起作用 如果我进入 WP 登录页面 它就会起作用 任何帮助表示赞赏 function
  • 图片无法直接上传到相册

    我正在开发上传图片文件的应用程序 但图片不能直接上传到相册 上传之前始终必须经过批准 如何解决这个问题 问题 您想将这些照片添加到您的相册吗 下面的照片是从另一个应用程序上传的 您需要批准它们 你需要user photos允许直接上传到相册
  • PayPal Rest API for Payments 在沙箱中返回 NULL

    我有一个 PayPal 沙盒帐户 我可以在 PHP 上使用curl 通过 api 检索令牌 但是处理测试卡只会返回 null 有人看到代码有问题吗 这是 PayPal 沙盒的已知问题吗 下面代码片段中的客户端是伪造的 但是 如前所述 使用我
  • 对需要发送标头的项目进行单元测试

    我目前正在与 PHPUnit 合作 尝试在我正在编写的内容的同时开发测试 但是 我目前正在编写会话管理器 并且在这样做时遇到了问题 Session 处理类的构造函数是 private function construct if header
  • PDO 如何在执行 rollBack() 函数之前回滚查询?

    这是我的脚本 try dbh con gt beginTransaction stmt1 dbh conn gt prepare UPDATE activate account num SET num num 1 stmt1 gt exec
  • PHP DOM 获取节点值 html? (不剥离标签)

    我正在尝试使用nodeValue获取文件中div标签的innerhtml 但是此代码仅输出纯文本 并且似乎从div内部删除了所有html标签 我如何更改此代码以输出 div 的 HTML 内容而不是纯文本 并且还输出包装其子元素的主 div
  • CodeIgniter Active Record - 组 OR 语句

    这是我的问题 MySQL 或 条件 https stackoverflow com questions 8604380 mysql or condition 解决方案是将 OR 语句分组 但我正在使用 CodeIgniters Active
  • PHP: $arr['key'] 上的 is_array 不存在 'key'

    我的一所大学似乎在我编写的代码中存在 未定义索引 错误 我的这段代码如下所示 if is array arr key 我的目的是检查 arr 是否有一个名为 key 的键 以及该键的值是否是数组本身 我应该这样做吗 if isset arr
  • 是否可以使用 PHP 检测用户来自哪个操作系统? (Mac 或 Windows)

    比方说 我想回应 你正在使用 Windows 或 您正在使用 Macintosh 具体取决于用户的操作系统 这可能吗 通过分析 SERVER HTTP USER AGENT 可以说出什么system and browser 用户是claim
  • PHP json_encode 将多个数组编码为一个对象

    我试图在一个 JSON 对象中返回多个数组 但在语法上遇到一些困难 一款 Android 应用程序从多个表接收更新 我希望在一个响应中返回这些更新 目前 这就是我对各种结果集进行编码的方式 json json encode array ta
  • 如何使用 PHP SoapClient 添加任意命名空间?

    如何使用 PHP SoapClient 添加任意名称空间 命名空间实际上并未在请求中使用 但我认为它阻止了我的消息被正确使用 WSDL 在这里 http abr business gov au abrxmlsearchRPC ABRXMLS
  • PHP 和 ASP.Net 可以在 IIS 7.5 中的同一网站中一起运行吗?

    我们网站的一部分是用 PHP 完成的 而我们网站的一部分是用 ASP Net 完成的 我们刚刚使用 Windows Server 2008 R2 设置了一个新的 Web 服务器 其中安装了 IIS 7 5 我知道 IIS 7 支持 PHP
  • 表单未使用 AJAX 提交

    再次更新 如果有人关心的话 我之前发布的解决方案由于某种原因停止工作 我在 ajax 请求中包含了 beforeSend 并将验证表单的 js 部分粘贴到其中 现在就像一个魅力 form on submit function e e pre
  • 如何在 MySQL 中使用 INET_ATON 进行通配符搜索 IP 地址?

    我发现这个方法可以使用 INET ATON 将 IP 地址作为整数存储在 MySQL 数据库中 https stackoverflow com a 5133610 4491952 https stackoverflow com a 5133
  • Symfony 4.1 组件 - 依赖注入问题

    我正在用 PHP 重构旧应用程序 我正在尝试使用 Symfony 依赖注入组件将服务注入控制器 或其他服务 但我不知道如何实现这一点 因为 symphony 文档比框架组件更适合使用框架 我已经有了自己的内核 包含所有服务和控制器的容器 控
  • 按时间戳字段中的日期过滤结果

    我已经获得了一些帮助 但不确定为什么这不起作用 我正在尝试使用表单让用户过滤他们的活动 存储在数据库中 My code GET from 01 11 2013 GET to 25 11 2013 from DateTime createFr
  • Curl 和 Php 5.3.3 中的 SSL 连接错误

    我的网站自 3 年来一直运行良好 代码如下 现在突然从 2 天开始出现以下错误 SSL 连接错误 在 Curl error 中 下面是我的代码
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f

随机推荐