[java] 汇率换算器实现(1)
[java] 汇率换算器实现(1)
[java] 汇率换算器实现(1)
Table of Contents
1 问题描述
实现不同货币之间的汇率换算.
名词: 货币, 汇率
动词: 换算
2 类设计
class list:
- Money
- double amount: 货币的数量
- String unit: 货币的单位
- Rate
- private Hashtable rateTable: 用来存储不同货币之间的汇率
3 初步实现
3.1 建立项目目录结构
.
├── build.xml
├── lib
│ ├── hamcrest-core.jar
│ └── junit.jar
├── README.txt
├── run
└── src
└── com
└── cnblogs
└── grassandmoon
其中, build.xml为ant执行所需的配置文件. run为shell文件, 用于运行编译后的java程序.
build.xml文件内容如下:
<?xml version="1.0"?> <!-- build.xml - a simple Ant buildfile -->
<project name="javacookbook" default="all" basedir="."> <!-- The directory containing source code -->
<property name="src.dir" value="src"/>
<property name="lib.dir" value="lib"/> <!-- Temporary build directories -->
<property name="build.dir" value="build"/>
<property name="build.classes" value="${build.dir}/classes"/> <property name="java.lib" value="${java.home}/jre/lib/rt.jar"/> <!-- Target to create the build directories prior to the -->
<!-- compile target. -->
<target name="prepare">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes}"/>
</target> <target name="all" depends="project"/> <target name="project" depends="prepare">
<javac srcdir="${src.dir}"
destdir="${build.classes}"
classpath="${java.lib}:${lib.dir}/junit.jar:${build.classses}"
debug="on"
includeantruntime="on"/>
</target> <target name="clean" description="Remove all generated files.">
<delete dir="${build.dir}"/>
</target>
</project>
3.2 建立测试文件
/** TestRate.java
* 用于货币汇率转换工具的测试
*/
package com.cnblogs.grassandmoon; import static org.junit.Assert.assertEquals;
import org.junit.Test; public class TestRate {
@Test
public void testGetRate() {
Money m = new Money(150, "USD"); Rate.setRate("USD", "CNY", 6.25);
Money mCNY = Rate.exchangeRate(m, "CNY"); assertEqual(new Money(150*6.25, "CNY"), mCNY);
}
}
3.3 对应的实现文件, Money
package com.cnblogs.grassandmoon;
import java.util.*;
class Rate {
// 利用hashtable对不同货币之间的利率进行存储
// key: $from+$to, value: $rate
private static Hashtable rateTable = new Hashtable();
// 设置不同货币之间的利率
// 1 $from * $rate = 1 $to
public static void setRate(String from, String to, double rate) {
rateTable.put(from+to, new Double(rate));
}
private static double getRate(String key) {
Double db = (Double) rateTable.get(key);
return db.doubleValue();
}
// 将一定量的货币$m, 转变成单位为$to的货币量
// return: 相应的货币值
public static Money exchangeRate(Money m, String to) {
if (m.unit == to) return new Money(m);
String key = m.unit + to;
double rate = getRate(key);
return new Money(m.amount*rate, to);
}
}
public class Money {
double amount;
String unit;
public Money(double amount, String unit) {
setMoney(amount, unit);
}
public Money(Money m) {
setMoney(m.amount, m.unit);
}
public void setMoney(double amount, String unit) {
this.amount = amount;
this.unit = unit;
}
public boolean equals(Object obj) {
Money other = (Money) obj;
return amount == other.amount
&& unit.equals(other.unit);
}
}
3.4 增加输入输出: 一般化
有哪些内容需要进行输入输出呢?
输入
- 欢迎信息
欢迎使用汇率转换器
版本: 1.0 作者: 钟谢伟 - 帮助信息
1. 输入不同货币以及对应的汇率信息,
第一个为需要转换的货币单位
第二个为转换到的目标货币单位
第三个为相应的汇率
不同项目之间用空格隔开
如: USD CNY 6.25
表示: 1 USD * 6.25 = 1 CNY 2. 输入待转换量, 用空格隔开
如: 150 USD 3. 帮助 4. 退出
请进行选择 (1, 2, 3 or 4) - 不同货币单位以及相应的汇率
- 需要进行转换的货币量
输出
- 转换后的结果
如: 150 USD = 937.50 CNY
3.5 对应的实现, MoneyDemo
见初步实现代码.
3.6 小结
目前已经完成的功能:
- 人为的输入汇率
- 根据输入的汇率进行转换
需要进一步增加的功能:
- 当输入错误时, 如何进行处理?
- 当需要转换的货币单位, 没有在汇率表中时, 如何进行处理?
- 如何克服每次手动增加汇率的麻烦之处?
下面将根据上述的问题进行进一步的改进.
4 进一步的改进
4.1 输入格式统一以及错误处理
为了减少代码的重复量, 需要对汇率输入, 以及转换输入的格式进行统一, 如下:
- 汇率输入: 汇率 from币种 to币种, 如 6.25 USD CNY
- 转换输入: from币种货币量 from币种 to币种, 如 100 USD CNY
然后对输入的错误情况进行了处理:
- 格式错误
- 汇率转换过程中遇到没有相应的汇率信息的情况处理
此时的结果如下: #中间代码
// MoneyDemo.java
package com.cnblogs.grassandmoon; import java.io.*; class Helper {
public static void printVersion() {
System.out.println("欢迎使用汇率转换器");
System.out.println("版本: 1.0");
System.out.println();
System.out.println("作者: 钟谢伟");
System.out.println("email: grass-of-sky@163.com");
System.out.println();
} public static void printHelp() {
System.out.println("1. 输入不同货币以及对应的汇率信息,");
System.out.println(" 第一个为相应的汇率");
System.out.println(" 第二个为需要转换的货币单位");
System.out.println(" 第三个为转换到的目标货币单位");
System.out.println(" 不同项目之间用空格隔开");
System.out.println(" " + getRateUsage());
System.out.println(" 表示: 1 USD * 6.25 = 1 CNY");
System.out.println();
System.out.println("2. 输入待转换量, 用空格隔开");
System.out.println(" " + getExchangeUsage());
System.out.println();
System.out.println("3. 帮助");
System.out.println();
System.out.println("4. 退出");
System.out.println();
printUsage();
System.out.println();
} public static void printUsage() {
System.out.println("请选择 (1, 2, 3 或者 4)");
} public static String getRateUsage() {
return "如: 6.25 USD CNY";
} public static String getExchangeUsage() {
return "如: 100 USD CNY";
}
} class ReadLineTokens {
public double value;
public String from;
public String to; ReadLineTokens(double v, String f, String t) {
value = v;
from = f;
to = t;
}
} public class MoneyDemo {
// 对汇率输入, 以及转换输入进行处理, 提取不同的成份
static ReadLineTokens processReadLine(BufferedReader br)
throws IOException {
String inputLine = br.readLine();
String tokens[] = inputLine.split(" ");
if (tokens.length == 1 && tokens[0].equals("q")) {
return null;
} return new ReadLineTokens(new Double(tokens[0]),
tokens[1],
tokens[2]);
} public static void main(String[] args)
throws IOException {
String cmdLine = null;
String inputMsg = null;
Money m = new Money();
Money exchanged = new Money();
ReadLineTokens tokens;
boolean inputError = false;
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
Helper.printVersion();
Helper.printHelp(); while (true) {
cmdLine = br.readLine();
if (cmdLine.equals("1")) {
do {
try {
System.out.print("输入汇率关系 " +
Helper.getRateUsage() +
" (退出当前选项 \"q\"): "); // input "q" to quick this step
tokens = processReadLine(br);
if (tokens == null) {
break;
} Rate.setRate(tokens.from, tokens.to, tokens.value);
System.out.println();
inputError = false;
} catch (Exception e) {
System.out.println("\n\t请按照正确的格式进行输入\n");
inputError = true;
}
} while (inputError);
} else if (cmdLine.equals("2")) {
do {
try {
System.out.print("输入待转换量 " +
Helper.getExchangeUsage() +
" (退出当前选项 \"q\"): "); // input "q" to quit this step
tokens = processReadLine(br);
if (tokens == null) {
break;
} m.setMoney(tokens.value, tokens.from);
exchanged = Rate.exchangeRate(m, tokens.to);
System.out.println(m + " = " + exchanged);
System.out.println();
inputError = false;
} catch (IllegalArgumentException e) {
System.out.println("\n\t汇率转换表中没有相应的转换项\n");
inputError = true;
} catch (Exception e) {
System.out.println("\n\t请按照正确的格式进行输入\n");
inputError = true;
}
} while (inputError);
} else if (cmdLine.equals("3")) {
Helper.printHelp();
} else if (cmdLine.equals("4")) {
break;
} else {
Helper.printUsage();
}
}
}
} // Money.java
package com.cnblogs.grassandmoon; import java.util.*; class Rate {
// 利用hashtable对不同货币之间的利率进行存储
// key: $from+$to, value: $rate
private static Hashtable rateTable = new Hashtable(); // 设置不同货币之间的利率
// 1 $from * $rate = 1 $to
public static void setRate(String from, String to, double rate) {
rateTable.put(from+to, new Double(rate));
} // 将一定量的货币$m, 转变成单位为$to的货币量
// return: 相应的货币值
public static Money exchangeRate(Money m, String to) {
if (m.unit.equals(to)) return new Money(m);
String key = m.unit + to;
Double rate = (Double) rateTable.get(key); if (rate == null) {
throw new IllegalArgumentException();
} return new Money(m.amount*rate.doubleValue(), to);
}
} public class Money {
double amount;
String unit; public String toString() {
return amount + " " + unit;
} public Money() {
setMoney(0.0, null);
} public Money(double amount, String unit) {
setMoney(amount, unit);
} public Money(Money m) {
setMoney(m.amount, m.unit);
} public void setMoney(double amount, String unit) {
this.amount = amount;
this.unit = unit;
} public boolean equals(Object obj) {
Money other = (Money) obj;
return amount == other.amount
&& unit.equals(other.unit);
}
}
4.2 调用最新的汇率信息
将在下次继续.
Date: 2014-05-05 Mon
Author: Zhong Xiewei
Org version 7.8.11 with Emacs version 24
[java] 汇率换算器实现(1)的更多相关文章
- [java] 汇率换算器实现(3)
[java] 汇率换算器实现(3) // */ // ]]> [java] 汇率换算器实现(3) Table of Contents 1 系列文章地址 2 前言 3 提取简单表单信息 3.1 ...
- [java] 汇率换算器实现-插曲1-正则表达式(1)
[java] 汇率换算器实现-插曲1-正则表达式(1) // */ // ]]> // */ // ]]> [java] 汇率换算器实现-插曲1-正则表达式(1) Table of C ...
- [java] 汇率换算器实现(2)
[java] 汇率换算器实现(2) // */ // ]]> // */ // ]]> [java] 汇率换算器实现(2) Table of Contents 1 系列文章地址 2 前 ...
- [java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]> [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...
- [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3
[java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3 // */ // ]]> [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3 Table of C ...
- [java] jsoup使用简介-汇率换算器实现-插曲2
[java] jsoup使用简介-汇率换算器实现-插曲2 // */ // ]]> [java] jsoup使用简介-汇率换算器实现-插曲2 Table of Contents 1 系列文章 ...
- 【菜鸟学Python】案例一:汇率换算
汇率换算V1.0 案例描述: 设计一个汇率换算器程序,其功能是将外币换算成人民币,或者相反 案例分析: 分析问题:分析问题的计算部分: 确定问题:将问题划分为输入.处理及输出部分: 设计算法:计算部分 ...
- 汇率换算自然语言理解功能JAVA DEMO
>>>>>>>>>>>>>>>>>>>>>>>> 欢迎转 ...
- 万航单位换算器 V1.0 绿色版
软件名称: 万航单位换算器软件语言: 简体中文授权方式: 免费软件运行环境: Win 32位/64位软件大小: 347KB图片预览: 软件简介:万航单位换算器是一个可以随意转换单位的绿色软件,这个软件 ...
随机推荐
- ansible 自动化(1)
安装篇: yum安装 1.安装第三方epel源 centos 6的epel rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-rel ...
- unity渲染层级关系小结(转存)
最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这里就把自己解决问题中总结的经验记录下来. Unity中的渲染顺序自上而下大致分为三层. 最高层为Camera层,可 ...
- javascript定时函数
setTimeout(表达式,延迟时间)是定时程序,也就是在什么时间以后干什么,只做一次,就不做了.表达式为字符串函数或其它表达式,时间单位为毫秒 例子:setTimeout("f()&qu ...
- 【腾讯Bugly干货分享】移动互联网测试到质量的转变
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ee0934b690d84c3188d7c7 Dev Club 是一个交流移动 ...
- Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse
框架学习前言 这个模块是面向Spring的,Spring的学习我是这么想的: 1.简单介绍Spring,主要是从网上借鉴一些重点 2.尽量说明清楚Spring的使用方法以及细节点 3.尽量以自己的理解 ...
- 设计模式之美:Product Trader(操盘手)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Product Trader 的示例实现. 意图 使客户程序可以通过命名抽象超类和给定规约来创建对象. Product Trad ...
- 【月末轻松篇】--- 那些奇葩的Bugs
不能说所有的bug都是纸老虎,但往往那种看似很奇葩的bug,导致的原因确实很简单,烦了你一段时间,找到真相又让你忍不住一笑.什么是奇葩的bug呢.我的定义是:代码逻辑都一样,但在A处是好的,到了B处就 ...
- DNS拾遗(一)
最近帮朋友注册域名配置主机,碰到一些DNS上的一些概念,惭愧于有一些东西已经忘记是啥意思,于是决定重新学习一下DNS方面的基本概念. 常用概念: TTL: TTL为Time to live的缩写,网络 ...
- AWS系列之三 使用EBS
Amazon Elastic Block Store(EBS)可作为EC2实例的持久性数据块级存储.其具有高可用性和持久性的特点,可用性高达99.999%.给现有的EC2实例扩展新的存储块只需要几分钟 ...
- C# socket编程实践——支持广播的简单socket服务器
在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...