CalService

package org.crazyit.cal;

import java.math.BigDecimal;

/**
 * 计算业务类
 *
 * @author yangenxiong [email protected]
 * @author Kelvin Mak [email protected]
 * @version  1.0
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
 * <br>Copyright (C), 2009-2010, yangenxiong
 * <br>This program is protected by copyright laws.
 */
public class CalService {
	// 存储器,默认为0,用于保存需要暂时保存的计算结果
	private double store = 0;
	// 第一个操作数
	private String firstNum = null;
	// 上次操作
	private String lastOp = null;
	// 第二个操作数
	private String secondNum = null;
	// 是否第二个操作数,如果是,点击数字键时,则在文本框中重新输入
	private boolean isSecondNum = false;

	// 数字
	private String numString = "0123456789.";
	// 四则运算
	private String opString = "+-*/";

	/**
	 * 默认构造器
	 */
	public CalService() {
		super();
	}

	/**
	 * 调用方法并返回计算结果
	 *
	 * @return String
	 */
	public String callMethod(String cmd, String text) throws Exception {
		if (cmd.equals("C")) {
			return clearAll();
		} else if (cmd.equals("CE")) {
			return clear(text);
		} else if (cmd.equals("Back")) {
			return backSpace(text);
		} else if (numString.indexOf(cmd) != -1) {
			return catNum(cmd, text);
		} else if (opString.indexOf(cmd) != -1) {
			return

					setOp(cmd, text);
		} else if (cmd.equals("=")) {
			return cal(text, false);
		} else if (cmd.equals("+/-")) {
			return setNegative(text);
		} else if (cmd.equals("1/x")) {
			return setReciprocal(text);
		} else if (cmd.equals("sqrt")) {
			return sqrt(text);
		} else if (cmd.equals("%")) {
			return cal(text, true);
		} else {
			return mCmd(cmd, text);
		}
	}

	/**
	 * 计算四则运算结果
	 *
	 * @param text
	 *            String 输入框中的值
	 * @param isPercent
	 *            boolean 是否有"%"运算
	 * @return String 封闭成字符串的计算结果
	 */
	public String cal(String text, boolean isPercent) throws Exception {
		// 初始化第二个操作数
		double secondResult = secondNum == null ? Double.valueOf(text)
				.doubleValue() : Double.valueOf(secondNum).doubleValue();
		// 如果除数为0,不处理
		if (secondResult == 0 && this.lastOp.equals("/")) {
			return "0";
		}
		// 如果有"%"操作,则第二个操作数等于两数相乘再除以100
		if (isPercent) {
			secondResult = MyMath.multiply(Double.valueOf(firstNum), MyMath
					.divide(secondResult, 100));
		}
		// 四则运算,返回结果赋给第一个操作数
		if (this.lastOp.equals("+")) {
			firstNum = String.valueOf(MyMath.add(Double.valueOf(firstNum),
					secondResult));
		} else if (this.lastOp.equals("-")) {
			firstNum = String.valueOf(MyMath.subtract(Double.valueOf(firstNum),
					secondResult));
		} else if (this.lastOp.equals("*")) {
			firstNum = String.valueOf(MyMath.multiply(Double.valueOf(firstNum),
					secondResult));
		} else if (this.lastOp.equals("/")) {
			firstNum = String.valueOf(MyMath.divide(Double.valueOf(firstNum),
					secondResult));
		}
		// 给第二个操作数重新赋值
		secondNum = secondNum == null ? text : secondNum;
		// 把isSecondNum标志为true
		this.isSecondNum = true;
		return firstNum;
	}

	/**
	 * 计算倒数
	 *
	 * @param text
	 *            String 输入框中的值
	 * @return String 封闭成字符串的结果
	 */
	public String setReciprocal(String text) {
		// 如果text为0,则不求倒数
		if (text.equals("0")) {
			return text;
		} else {
			// 将isSecondNum标志为true
			this.isSecondNum = true;
			// 计算结果并返回
			return String.valueOf(MyMath.divide(1, Double.valueOf(text)));
		}
	}

	/**
	 * 计算开方
	 *
	 * @param text
	 *            String 输入框中的值
	 * @return String 封闭成字符串的结果
	 */
	public String sqrt(String text) {
		// 将isSecondNum标志为true
		this.isSecondNum = true;
		// 计算结果并返回
		return String.valueOf(Math.sqrt(Double.valueOf(text)));
	}

	/**
	 * 设置操作符号
	 *
	 * @param cmd
	 *            String 操作符号
	 * @param text
	 *            String 输入框中的值
	 * @return String 封闭成字符串的结果
	 */
	public String setOp(String cmd, String text) {
		// 将此操作符号设置为上次的操作
		this.lastOp = cmd;
		// 设置第一个操作数的值
		this.firstNum = text;
		// 将第二个操作数赋值为空
		this.secondNum = null;
		// 将isSecondNum标志为true
		this.isSecondNum = true;
		// 返回空值
		return null;
	}

	/**
	 * 设置正负数
	 *
	 * @param text
	 *            String 输入框中的值
	 * @return String 封闭成字符串的结果
	 */
	public String setNegative(String text) {
		// 如果text是负数,就将它变为正数
		if (text.indexOf("-") == 0) {
			return text.substring(1, text.length());
		}
		// 否则,将正数变成负数
		return text.equals("0") ? text : "-" + text;
	}

	/**
	 * 连接输入的数字,每次点击数字 把新加的数字追加到后面
	 *
	 * @param cmd
	 *            String 操作符号
	 * @param text
	 *            String 输入框中的值
	 * @return String 封闭成字符串的结果
	 */
	public String catNum(String cmd, String text) {
		String result = cmd;
		// 如果目前的text不等于0
		if (!text.equals("0")) {
			if (isSecondNum) {
				// 将isSecondNum标志为false
				isSecondNum = false;
			} else {
				// 刚返回结果为目前的text加上新点击的数字
				result = text + cmd;
			}
		}
		// 如果有.开头,刚在前面补0
		if (result.indexOf(".") == 0) {
			result = "0" + result;
		}
		return result;
	}

	/**
	 * 实现backspace功能
	 *
	 * @param text
	 *            String 现在文体框的结果
	 * @return String
	 */
	public String backSpace(String text) {
		return text.equals("0") || text.equals("") ? "0" : text.substring(0,
				text.length() - 1);
	}

	/**
	 * 实现存储操作命令
	 *
	 * @param cmd
	 *            String 操作符号
	 * @param text
	 *            String 现在文体框的结果
	 * @return String
	 */
	public String mCmd(String cmd, String text) {
		if (cmd.equals("M+")) {
			// 如果是"M+"操作,刚把计算结果累积到store中
			store = MyMath.add(store, Double.valueOf(text));
		} else if (cmd.equals("MC")) {
			// 如果是"MC"操作,则清除store
			store = 0;
		} else if (cmd.equals("MR")) {
			// 如果是"MR"操作,则把store的值读出来
			isSecondNum = true;
			return String.valueOf(store);
		} else if (cmd.equals("MS")) {
			// 如果是"MS"操作,则把计算结果保存到store
			store = Double.valueOf(text).doubleValue();
		}
		return null;
	}

	/**
	 * 清除所有计算结果
	 *
	 * @return String
	 */
	public String clearAll() {
		// 将第一第二操作数恢复为默认值
		this.firstNum = "0";
		this.secondNum = null;
		return this.firstNum;
	}

	/**
	 * 清除上次计算结果
	 *
	 * @param text
	 *            String 现在文体框的结果
	 * @return String
	 */
	public String clear(String text) {
		return "0";
	}

	/**
	 * 返回存储器中的结果
	 *
	 * @return double
	 */
	public double getStore() {
		return this.store;
	}

}

  

时间: 2024-10-12 09:17:54

CalService的相关文章

在net.tcp模式下,由SvcUtil.exe生成代理类文件和配置文件(转)

WCF服务调用可以采用两个方法,由工具SvcUtil.exe生成本地代理服务类和配置文件方式,或者采用ChannelFactory直接创建服务代理对象.本文主要采用前面一种方式来进行. SvcUtil.exe位于:C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin目录下,可以将本工具添加到VS2010的工具菜单中,以方便使用: VS菜单->工具->外部工具->添加->在“命令”文本框选取其路径如下:C:\Program Files\M

android开发系列之aidl

aidl在android开发中的主要作用就是跨进程通讯来着,说到进程相比很多人都是非常熟悉了,但是为什么会有跨进程通讯这个概念呢?原来在android系统中,有这么一套安全机制,为了各个Apk数据的独立性.安全性,它们彼此之间是不能直接进行数据的访问的.所以为了实现多个APK之间的数据.方法.代码复用,我们通常采用的做法就是定义好AIDL接口,这样就能够既保护现有代码的逻辑性.同时又能够兼顾好封装性,各个团队之间只需要沟通好AIDL接口定义就可以了. 下面让我们直接进入主题吧,在进行AIDL定义

Web Service 之JAX-WS 与CXF实现

Web Service的实现方式有很多种,本篇介绍的是基于JAX-WS(纯Java)实现的,然后借由CXF工具生成Javabean. 第一步:创建一个Java工程,编写CalService接口,此接口就是提供Web服务的接口. 1 package com.fx.inf; 2 3 import javax.jws.WebMethod; 4 import javax.jws.WebService; 5 6 //标记服务端点接口(SEI) 7 @WebService 8 public interfac

WCF宿主Window Service Demo

尝试了下将服务寄宿在window 服务上.具体步骤如下 整个解决方案截图 一.创建window 服务 Wcf.WinService namespace Wcf.WinService { public partial class CalService : ServiceBase { public ServiceHost serviceHost = null; //服务宿主 public CalService() { InitializeComponent(); base.ServiceName =

第一个 WCF项目 与 Ajax

WCF(Windows Communication Foundation)是作为.Net framework 3.0发布的,所以只有2008及其以上的版本才可以创建wcf应用程序 WCF是对现有分布式通信技术的整合,其中包括Com/DCom..Net Remoting.Web服务及其WSE(web服务的升级版本).MSMQ. 现在决定 学习WCF ,所以在博客园里参考 http://www.cnblogs.com/jiagoushi/archive/2013/03/15/2962351.html

Android(java)学习笔记165:Android下编写单元测试代码(Junit Test)

编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一行一行检查自己的代码,为了解决这样的问题就出现了: Android下编写单元测试代码-----Junit Test       测试逻辑是:在Eclipse我们待测试项目中编写测试代码,然后运行测试代码,系统会把代码布署到模拟器或者真机中,代码运行之后,会反馈测试结果给Eclipse,用户就知道业务逻辑类是否可以成功实现. 首先我们明确A

Android_Service组件详解

1.Service概述 Service服务是一个没有用户界面的在后台运行执行操作的应用组件,其它组件可以通过Intent意图启动这个Service去完成特定的功能,比如通过Service可以完成播放音乐等后台操作,且每个Service必须在manifest中 通过<service>来声明配置.每个service运行在宿主线程上,因此,访问网络读取Sdcard等耗时操作需要放在工作线程中!Android系统有五种进程ForegroundProcess(比如Activity处于resumed状态)