0

我一直在研究 C++ 类以从流中提取任意大小的数字,并希望利用数字标点符号语言环境方面。不用说, std::num_get 不会提取我的任意大小的数字类;它只提取内置数字类型。但是提取器可以从语言环境的 numpunct 和 moneypunct 方面获取格式信息。

我遇到的最困难的方面是数字分组。我知道并非所有文化都将数字分组为三个,并且有些文化具有可变大小的数字组。

我遇到了一个博客(http://blogs.msdn.com/b/oldnewthing/archive/2006/04/17/577483.aspx),其中显示了一些示例。维基百科 ( http://en.wikipedia.org/wiki/Decimal_mark#Examples_of_use ) 也有一个示例表。

C 和 C++ 标准已经实现了一种在语言环境机制中处理此问题的方法。但是这些实现为一些非常复杂的情况留下了语义空间。当我们告诉识别器需要正确的数字分组时,识别一个看不到尽头的数字序列将非常复杂。

那么,我们可以通过做一些假设来降低复杂性吗?这些来自我在提供的示例中观察到的共性。

(假设1)只有最不重要的一组数字可以有不同的大小,并且不能小于其他组的大小。

如果假设 1 失败,我们可能会依赖:

(假设 2a)只有少数不同的尺寸。(希望是 2。我还没有看到任何超过两种不同尺寸的示例。)

(假设 2b)一个不太重要的数字组总是比所有其他组更长的重要数字。

4

1 回答 1

0

从来没有人解决过这个问题,这让我很困扰,但最近我偶然发现了 Unicode Consortium 的Common Locale Data Repository(或CLDR

进一步深入研究,我发现了 CLDR 中数字格式模式的摘要图表(此处)。这包含两个基本的分组模式:

  1. #,##,##0.###: 印度语言,传统用法
  2. # ####: 中文和日文的繁体(CLDR里没有,后来才发现)
  3. #,##0.###: 其他所有人

因此,即使是我几年前的幼稚假设 #1 也提供了比需要的更多的自由度。

然而,数字格式图表似乎只涵盖了 10 种现代语言。例如,它不包括赫梯人、玛雅人或巴比伦人。

最后,我不相信std::num_get它适用于非位置符号(如罗马数字)。

于 2016-04-27T17:42:28.460 回答