- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我尝试使用 intl 包中的 NumberFormatter 类将整数拼写成斯洛文尼亚语单词(用于邮政申报),但结果完全错误且毫无意义。
$fmt = new NumberFormatter('sl', NumberFormatter::SPELLOUT);
$fmt->format(561);
结果是“petsto šestdeset ena”,而它应该是“petsto enainšestdeset”。看起来像儿戏。
在非常相似的克罗地亚语中,结果似乎还不错(“petsto šezdeset i jedan”)。
这是 PHP 翻译做得不好还是基于我的系统区域设置?我在 PHP 5.3.10/Ubuntu 12.04 上。
编辑:
intl 是 1.1.0 版本,当前是 3.0.0,所以可能已经修复了?
最佳答案
免责声明 - 我不会说斯洛文尼亚语或克罗地亚语。
PHP 扩展用于这些语言中的数字的模式似乎存在一些差距。要明白我的意思,您可以显示运行时使用的模式:
$fmt = new NumberFormatter('sl', NumberFormatter::SPELLOUT);
echo $fmt->getPattern();
如果您查看此输出,您可能会发现“%spellout-cardinal-masculine:”的一部分似乎从大约 30 跳到 100。
...
21: dvaset >%spellout-cardinal-masculine>;
30: <%spellout-cardinal-masculine<deset;
31: <%spellout-cardinal-masculine<deset >%spellout-cardinal-masculine>;
100: sto;
101: sto >%spellout-cardinal-masculine>;
200: dvjesto;
...
这意味着没有为高于 31 和低于 100 的数字定义规则。您输出的数字的“61”部分属于此间隙。
您可以生成自己的模式来解决此问题 - 我粘贴了 en-US 格式化程序的模式并稍微调整了一下,使其看起来像这样:
...
21: dvaset >%spellout-cardinal-masculine>;
30: <%spellout-cardinal-masculine<deset;
31: <%spellout-cardinal-masculine<deset >%spellout-cardinal-masculine>;
40: forty;
41: forty->%spellout-cardinal-masculine>;
50: fifty;
51: fifty->%spellout-cardinal-masculine>;
60: sixty;
61: sixty->%spellout-cardinal-masculine>;
70: seventy;
71: seventy->%spellout-cardinal-masculine>;
80: eighty;
81: eighty->%spellout-cardinal-masculine>;
90: ninety;
91: ninety->%spellout-cardinal-masculine>;
100: sto;
101: sto >%spellout-cardinal-masculine>;
200: dvjesto;
...
现在,如果我用 UTF-8 编码将它保存在一个名为 sl.txt 的新文件中,我可以将它加载到 NumberFormatter 中:
$pattern = file_get_contents('sl.txt')
$fmt = new NumberFormatter('sl', NumberFormatter::PATTERN_RULEBASED, $pattern);
echo($fmt->format(561));
这给了我以下输出:
petsto sixty-ena
当然这是错误的 - 它是斯洛文尼亚语和英语的混合体,但我认为如果您将格式编辑为如下所示:
...
61: >%spellout-cardinal-masculine>inšestdeset;
...
正如我所说,我不会说斯洛文尼亚语,因此您可能需要检查一下。但这将为您提供以下输出:
petsto enainšestdeset
您需要为 31-100 的每个缺失号码 block 添加此规则。您可能还想检查 ICU docs for rule based formatting以确保你得到它的正确性。
这是一个错误,但不是在 PHP 中 - 如果您想修复它,那么问题在 Unicode's Common Locale Data Repository 中在 this文件。 PHP 的 intl 使用 ICU,它使用 CLDR 数据。
关于PHP NumberFormatter 斯洛文尼亚语拼写错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19933200/
我想通过用语言环境拼写数字来本地化数字,最后使用了 ICU4J。我在许多地区都取得了成功,但似乎没有在格鲁吉亚、土耳其或阿拉伯语等地区完成。 ULocale locale = new ULocale(
我正在研究具有端点的 swagger API 规范: /authorizations 我也想为这个端点定义一个替代拼写(授权)。这可能吗?或者我是否需要为每个拼写定义一个单独的路由? /authori
我正在研究具有端点的 swagger API 规范: /authorizations 我也想为这个端点定义一个替代拼写(授权)。这可能吗?或者我是否需要为每个拼写定义一个单独的路由? /authori
我使用 Yahoo BOSS 的时间很短。这是一个简单的搜索 API,但拼写建议支持确实不那么强大。周围的人是否有任何关于在 BOSS 上获得更好的拼写建议的想法。 最佳答案 不幸的是,甚至在几年后,
问题如下:我正在编写一个强力解密器来破解一些 super secret 代码(这是一场竞赛,而不是犯罪),结果证明这是不可能的:树中的节点太多需要被搜查。为了克服这个问题,我认为检查中间“解决方案”以
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!