我正在玩弄一个应用程序,粗略地说,它是一种用于建筑行业的建模器应用程序。将来我希望用户可以同时使用 SI 单位和英制单位。据我了解,在美国建筑行业中,在指定测量值时习惯使用英寸的分数,例如 3 1/2" - 而在国际单位制中,我们会写 3.5,而不是 3 1/2。我正在寻找一种方法在我的软件中使用这些不同的系统 - 存储它们,对它们进行计算等,不仅解析用户输入的内容。它应该能够以他输入的方式向用户显示测量,但能够计算其他测量值 - 例如将 3 厘米添加到 1 1/2 英寸。因此,如果用户绘制 5 英尺的墙壁长度和 3 米的另一面,
我还没有决定应该为用户输入数据增加多少灵活性;例如,如果他输入 1 英尺 14 英寸,下次显示测量值时应该是 2 英尺 2 英寸吗?但是,在我决定这样的事情之前,我正在寻找一种以精确形式存储测量值的方法,这就是我的问题所在。
我正在使用 C++ 并且查看了 Boost.Units,但这似乎并没有提供处理分数的方法。
简单的选择是将所有内容转换为毫米,但舍入误差会导致无法返回到用户输入的精确测量值(如果他以英制测量值输入)。所以我需要一些更复杂的东西。
现在我正在使用一个暂时命名为“距离”的类,在概念上看起来像这样:
class Distance
{
public:
Distance(double value);
// operators +, -, *, /
Distance operator+(const Distance& that);
...etc...
std::string StringForm(); // Returns a textual form of the value
Distance operator=(double value);
private:
<question: what should go here?>
}
这清楚地表明了我的问题所在。最明显的做法是有一个枚举,说明此距离是存储 SI 单位还是英制单位,并具有存储米、厘米和毫米(如果是 SI 单位)和英尺和英寸(如果这是帝国的。然而,这将使类的实现充满 if(SI) else ...,并且非常浪费内存。另外,例如,我必须存储英尺和英寸的分子和分母才能准确存储 1/3"。
因此,鉴于我的设计要求,我正在寻找关于如何解决这些问题的一般设计建议。当然,如果有一个 C++ 库已经可以做这些事情,或者我可以查看另一种语言的库来复制概念,那就太好了。