需要为具有交叉汇率的外汇计算器构建逻辑

时间:2017-05-24 00:10:56

标签: java calculator forex

我正在尝试为外币计算器构建逻辑。

我已经获得了低于外币的映射及其费率(来自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

enter image description here 我已经编写了用于生成工作表的代码。一旦通过适当的交叉链接填充工作表,我将开始编写实际计算的代码。

运行此代码的输入将是:

console> AUD 100.00 in DKK

但这是下一阶段。现在我只是从Eclipse启动主类来填充表单。

2 个答案:

答案 0 :(得分:0)

您正面临着像数据结构这样的图形。每种货币都将是一个基于货币映射指向另一种货币的节点。例如,USD节点将指向EUR,CAD,CNY等。要查找USD到NOK之间的转换货币,您需要访问EUR节点,将其从USD转换为EUR,然后让EUR访问NOK并将其转换为NOK和NOK然后将值返回给调用者。

答案 1 :(得分:0)

逻辑可能会令人惊讶:业务条款&amp;条件将规则。

这种情况不是由汇率数据本身来规定,而是由实际业务条款和条件。理论上的可能性还必须包括交易成本,佣金和其他费用,它们将由任何交易场所累计(加上理论汇率),提供这种货币转换服务,因此原始的“理论”汇率不是一个完整的转换成本模型。

逻辑&amp;找到十字架的理论从专业开始:

enter image description here 其汇率值可能每秒变化+ 1000~100000次。如果这是您的项目所针对的现实,请忘记填写Excel表格。

每日修复:

如果您的意图不同,或者此类计算器旨在用于会计(在受监管的(国家间)国家背景下),每日“固定”汇率可能有所帮助,但是 - 再次 - 条款&amp;条件将适用,相应的费用和佣金等将添加到已公布的“理论”费率中。