gpt4 book ai didi

PHP NumberFormatter 斯洛文尼亚语拼写错误

转载 作者:可可西里 更新时间:2023-11-01 12:19:17 30 4
gpt4 key购买 nike

我尝试使用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com