如何创建高效的货币/单位转换器?

时间:2012-03-17 19:19:32

标签: java

我对如何创建高效计划提出了一般性问题。例如,我为Blackberry制作了一个单元转换器程序(终极单位转换器,如果你想检查它:)),它可以转换5-7个不同的单位。为了对此进行编码,我通过简单地为所有可能的单元创建方法来实现蛮力方式。因此,例如,我创建了以下所有方法:厘米到英寸,厘米到米,英寸到厘米,英寸到米,米到厘米,米到英寸,等等。

我的问题是:有更有效的编码方式吗?因为当我必须添加一个单元时会变得很痛苦,因为那时我必须创建另一组方法。

谢谢! (对不起,如果我听起来很愚蠢。)

5 个答案:

答案 0 :(得分:4)

简单:只需选择一个“标准”单位(比如SI单位)并转换为它。 例如,制作“英寸到米”,“米到英寸”,“厘米到米”,“米到厘米”等。要从英寸转换为厘米,只需调用“英寸到米”,然后“米到”厘米”。

要添加新单元,您只需添加两个方法:“NewUnit to meter”和“meter to NewUnit”。

当然,由您决定如何组织您的方法。例如,您可以使用一个将单位作为参数的方法。

答案 1 :(得分:3)

使用SI单位(你可以使用任何一个单位,但因为大多数单位都被定义为SI单位,这是最明智的imo)作为所有其他单位的基础和转换因子。

这样你只需要为每个单元存储一个值,并且最多可以在两个步骤中从单元A转换为B.这是原始方法的O(N)而不是O(N ^ 2)。此外,它允许使用枚举和一个功能轻松完成此操作。添加更多单位只是意味着将单位添加到枚举和(一个!)正确的转换因子

答案 2 :(得分:1)

是的。

  • 对于每种类型的测量(例如距离,时间,能量,金钱等),定义基本单位。如果SI适用,我建议。否则,选择你想要的任何东西。
  • 对于所有支持的单位,制作两个方法(用OO风格编写,可以是任何东西)
    1. base to_base_unit()
    2. from_base_unit(base)
  • 对于每个单位转换,请执行两步转换。例如。将a转换为bb.from_base_unit(a.to_base_unit())

答案 3 :(得分:0)

最简单的方法就是决定一个“基本单位”,让我们说长度为meters

如果您为每个单位制作方法以转换为米而不是全部,则可以通过转换x =>米=> y来转换x => y。

当然,这也允许您将每个单位的转换因子存储到米,而不需要创建两个以上的函数; to_meters和from_meters。

答案 4 :(得分:0)

不要重新发明轮子。 JSR 275已成为解决此问题的目标,JScience项目实现了JSR:

Amount<Length> lengthInCm = Amount.valueOf(5, SI.CENTIMETER);
Amount<Length> lengthInInches = lengthInCm.to(NonSI.INCH);    // conversion

long inches = lenghtInCm.longValue(NonSI.INCH);  // unboxing and conversion
long meters = lenghtInCm.longValue(SI.METER);    // unboxing and conversion