我只是想在android studio中创建这个小的android应用程序来转换货币。
我使用了2个Spinner
对象来只保存3个值(美元、英镑、欧元(:
if(actualType.equals("USD")){
if(wantedType.equals("POUND")){
montantConv = montantNonConv * 0.87;
}
else if(wantedType.equals("EURO")){
montantConv = montantNonConv;
}
}
else if(actualType.equals("POUND")){
if(wantedType.equals("EURO")){
montantConv = montantNonConv * 1.15;
}
else if(wantedType.equals("USD")){
montantConv = montantNonConv * 1.15;
}
}
else if(actualType.equals("EURO")){
if(wantedType.equals("USD")){
montantConv = montantNonConv * 1;
}
else if(wantedType.equals("POUND")){
montantConv = montantNonConv * 0.87;
}
}
如果使用if-else,则代码对于仅3个选项(输入+输出(的组合来说太长。
我只是想知道有没有更好的算法可以做到这一点?有50多种货币可供选择的在线货币是如何做到的?
正如您所发现的,在转换逻辑中放入货币名称不是一个好主意。这同样适用于转换值。您应该希望编写代码来尽量减少类似的事情。您希望在不明确知道("硬编码"(货币名称或汇率的情况下对实际转换逻辑进行编码。
与其在代码中包含类似actualType.equals("POUND")
的内容,不如尝试让代码中的每个值都由一个变量表示:actualType.equals(otherType)
。
在现实生活中,您的数据可能来自外部来源,例如文本文件、数据库或其他计算机。在您的小型演示应用程序中,您可能希望在程序启动时加载数据,并使用数组和/或Collection
对象进行存储。此时,您还将使用相同的数据加载Spinner
对象中的值。
你可能会考虑是否值得再上一节课:
class Money {
String name;
double conversionValue;
Money (String name, double value) {
this.name = name;
conversionValue = value;
}
等等。(注意:我省略了可见性说明符。(
在你的转换应用程序中,你可以用一个数组模拟外部源:
Money [] market = { new Money ("Euro", 1.00), new Money ("USD", 1.00),
new Money ("Pound", 1.15), new Money ("Yen", 0.007),
new Money ("Rupee", 0.0125), ... };
创建另一个class
来粘合货币和兑换因子的另一种选择是使用Map <String, Double>
,以货币名称为键,兑换因子为值。
因此,转换应用程序可能有这样的方法:
public double convertMoney (String selling, int amt, String buying)
{ ...
或
public double convertMoney (Money selling, int sellingAmt, Money buying) { ...
根据名称和值的存储方式,它将使用字符串值查找2个转换值。汇率将是与selling
相关联的转换值除以与buying
相关联的转化值。