我正在尝试为外币计算器构建逻辑。
我已经获得了低于外币的映射及其费率(来自application_input.properties):
EURUSD=1.2
USDJPY=11.95
AUDUSD=21.83
CADUSD=2.87
USDCNY=6.17
GBPUSD=1.56
NZDUSD=3.77
EURCZK=2.60
EURDKK=7.44
EURNOK=8.66
如果我必须找到欧元到美元的转换,那么我得到了......直接给出了欧元 - 美元= 1.2
如果我需要DKK到EUR,也可以反过来,即1 / 7.44
如果我需要AUD到CZK,可以通过链接(一个十字)AUD - >找到美元 - >欧元(欧元兑美元汇率反转) - > CZK
我正在尝试思考逻辑(在Java中使用任何API),但现在无法找到。
有人可以帮助我吗?
我尝试创建一张包含所有货币映射的表格(表格)。这样我就可以访问该表,看看如何找到货币之间的联系。我能够生成具有直接利率/反向利率的货币,并坚持产生交叉货币汇率之间的联系。
以下是代码:
package com.nitin.fxcalculator;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) throws IOException {
App app = new App();
/*Scanner scanner = new Scanner(System. in);
String input = scanner.nextLine();
String [] inputParams = input.split("\\s+");
if(ifValidParams(inputParams) == false) {
System.exit(1);
}*/
Properties propFile = app.loadInputFile();
Set<String> currencies = findCurrencyAvailable(propFile);
Map<String, Double> currencyRate = getCurrencyRates(propFile);
System.out.println("Rates given - "+ currencyRate.size());
System.out.println(currencyRate);
generateCurrencyLink(currencies, currencyRate);
}
public static boolean ifValidParams(String [] inputParams) {
if(inputParams.length != 4) {
System.out.println("Incorrect no of arguments");
return false;
}
if(!inputParams[2].equals("in")) {
System.out.println("Invalid args at position - " + 3);
return false;
}
return true;
}
/*************
*
* @return
* @throws IOException
*/
public Properties loadInputFile() throws IOException {
Properties prop = new Properties();
InputStream input = null;
ClassLoader classLoader = this.getClass().getClassLoader();
File file = new File(classLoader.getResource("application_input.properties").getFile());
input = new FileInputStream(file);
prop.load(input);
return prop;
}
/*******************************************
* Read the input properties file
* where initial currencies and values
* are given.
* Determine the total currencies available
* and return a set of those
* @return
* @throws IOException
*******************************************/
public static Set<String> findCurrencyAvailable(Properties prop) throws IOException {
Set<String> setOfCurrencies = new TreeSet<String>();
for(Object setItem : prop.keySet()) {
String key = (String)setItem;
setOfCurrencies.add(key.substring(0, 3));
setOfCurrencies.add(key.substring(3, 6));
}
return setOfCurrencies;
}
public static Map<String, Double> getCurrencyRates(Properties prop) {
Map<String, Double> currencyRate = new HashMap<String, Double>();
for(Entry<Object, Object> property : prop.entrySet()) {
currencyRate.put((String)property.getKey(), Double.valueOf((String)property.getValue()));
}
return currencyRate;
}
public static void generateCurrencyLink(Set<String> currencies, Map<String, Double> currencyRate) throws IOException {
FileOutputStream file = new FileOutputStream (new File("C:\\temp.xls"));
//Get the workbook instance for XLS file
HSSFWorkbook workbook = new HSSFWorkbook();
//Get first sheet from the workbook
HSSFSheet sheet = workbook.createSheet("sample");
Row row = sheet.createRow(0);
int cellnum = 1;
for (String currency : currencies) {
Cell cell = row.createCell(cellnum++);
cell.setCellValue(currency);
}
int rowNum = 1;
String key = null;
String keyInverse = null;
String value = null;
for(int i = 0 ; i < currencies.size();i++) {
row = sheet.createRow(rowNum);
int cellNum = 0;
for (int j = 0;j < currencies.size();j++) {
Cell cell = null;
if(cellNum == 0) {
cell = row.createCell(cellNum++);
cell.setCellValue((String)currencies.toArray()[i]);
}
if(rowNum == cellNum) {
cell = row.createCell(cellNum);
cell.setCellValue("1:1");
} else {
//create a key like : audcad/audeur/audusd
key = row.getCell(0).getStringCellValue() + (String)currencies.toArray()[j] ;
keyInverse = (String)currencies.toArray()[j] + row.getCell(0).getStringCellValue();
if(currencyRate.get(key) != null) {
cell = row.createCell(cellNum);
cell.setCellValue("D");
} else if(currencyRate.get(keyInverse) != null) {
cell = row.createCell(cellNum);
cell.setCellValue("Inv");
} else {
for(String currencyKey : currencyRate.keySet()) {
int len = row.getCell(0).getStringCellValue().length();
String crossKey = currencyKey.substring(3) + (String)currencies.toArray()[j];
String crossKeyInv = (String)currencies.toArray()[j] + currencyKey.substring(3);
if(currencyRate.containsKey(crossKey) || currencyRate.containsKey(crossKeyInv)) {
cell = row.createCell(cellNum);
cell.setCellValue(currencyKey.substring(3));
}
}
}
}
cellNum++;
}
rowNum++;
}
workbook.write(file);
file.close();
}
}
上面的代码生成了这样的表格: ForexCurrencyMapping
我已经编写了用于生成工作表的代码。一旦通过适当的交叉链接填充工作表,我将开始编写实际计算的代码。
运行此代码的输入将是:
console> AUD 100.00 in DKK
但这是下一阶段。现在我只是从Eclipse启动主类来填充表单。
答案 0 :(得分:0)
您正面临着像数据结构这样的图形。每种货币都将是一个基于货币映射指向另一种货币的节点。例如,USD节点将指向EUR,CAD,CNY等。要查找USD到NOK之间的转换货币,您需要访问EUR节点,将其从USD转换为EUR,然后让EUR访问NOK并将其转换为NOK和NOK然后将值返回给调用者。
答案 1 :(得分:0)
这种情况不是由汇率数据本身来规定,而是由实际业务条款和条件。理论上的可能性还必须包括交易成本,佣金和其他费用,它们将由任何交易场所累计(加上理论汇率),提供这种货币转换服务,因此原始的“理论”汇率不是一个完整的转换成本模型。
其汇率值可能每秒变化+ 1000~100000次。如果这是您的项目所针对的现实,请忘记填写Excel表格。
如果您的意图不同,或者此类计算器旨在用于会计(在受监管的(国家间)国家背景下),每日“固定”汇率可能有所帮助,但是 - 再次 - 条款&amp;条件将适用,相应的费用和佣金等将添加到已公布的“理论”费率中。