`
请输入用户名
  • 浏览: 46838 次
  • 性别: Icon_minigender_1
  • 来自: martian
社区版块
存档分类
最新评论

实习单位的数字的处理的类

    博客分类:
  • java
阅读更多

package com.anyi.business.bank.tpp.pub;

import java.math.BigDecimal;

import com.martian.utils.tools.LogTools;//公司的框架,封装log4j,记录日志

/**
 * 数字的处理
 */
public class MathTools {
	/** 两位精度 */
	private final static int PRECISION_TWO = 2;

	private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();

	private static final String[] UNITS = { "元", "角", "分", "整" };

	private static final String[] U1 = { "", "拾", "佰", "仟" };

	private static final String[] U2 = { "", "万", "亿" };

	/**
	 * 求和:四舍五入,小数点后保留两位有效数字
	 * 
	 * @param augend
	 *            被加数
	 * @param addend
	 *            加数
	 * @return 和
	 */
	public static double add(double augend, double addend) {
		BigDecimal sum = BigDecimal.valueOf(augend).add(
				BigDecimal.valueOf(addend));
		return setScale(sum).doubleValue();
	}

	/**
	 * 求差:四舍五入,小数点后保留两位有效数字
	 * 
	 * @param minuend
	 *            被减数
	 * @param subtrahend
	 *            减数
	 * @return 差
	 */
	public static double subtract(double minuend, double subtrahend) {
		BigDecimal difference = BigDecimal.valueOf(minuend).subtract(
				BigDecimal.valueOf(subtrahend));
		return setScale(difference).doubleValue();
	}

	/**
	 * 求积:四舍五入,小数点后保留两位有效数字
	 * 
	 * @param multiplicand
	 *            被乘数
	 * @param multiplier
	 *            乘数
	 * @return 积
	 */
	public static double multiply(double multiplicand, double multiplier) {
		BigDecimal product = BigDecimal.valueOf(multiplicand).multiply(
				BigDecimal.valueOf(multiplier));
		return setScale(product).doubleValue();
	}

	/**
	 * 求商:四舍五入,小数点后保留两位有效数字
	 * 
	 * @param dividend
	 *            被除数
	 * @param divisor
	 *            除数
	 * @return 商
	 */
	public static double divide(double dividend, double divisor) {
		int scale = PRECISION_TWO;
		int roundingMode = BigDecimal.ROUND_HALF_UP;
		BigDecimal quotient = BigDecimal.valueOf(dividend).divide(
				BigDecimal.valueOf(divisor), scale, roundingMode);
		return quotient.doubleValue();
	}

	/**
	 * 求和:四舍五入,根据参数scale确定小数点后保留有效数字位数
	 * 
	 * @param augend
	 *            被加数
	 * @param addend
	 *            加数
	 * @param scale
	 *            刻度、数值范围
	 * @return 和
	 */
	public static double add(double augend, double addend, int scale) {
		BigDecimal sum = BigDecimal.valueOf(augend).add(
				BigDecimal.valueOf(addend));
		return setScale(sum, scale).doubleValue();
	}

	/**
	 * 求差:四舍五入,根据参数scale确定小数点后保留有效数字位数
	 * 
	 * @param minuend
	 *            被减数
	 * @param subtrahend
	 *            减数
	 * @param scale
	 *            刻度、数值范围
	 * @return 差
	 */
	public static double subtract(double minuend, double subtrahend, int scale) {
		BigDecimal difference = BigDecimal.valueOf(minuend).subtract(
				BigDecimal.valueOf(subtrahend));
		return setScale(difference, scale).doubleValue();
	}

	/**
	 * 求积:四舍五入,根据参数scale确定小数点后保留有效数字位数
	 * 
	 * @param multiplicand
	 *            被乘数
	 * @param multiplier
	 *            乘数
	 * @param scale
	 *            刻度、数值范围
	 * @return 积
	 */
	public static double multiply(double multiplicand, double multiplier,
			int scale) {
		BigDecimal product = BigDecimal.valueOf(multiplicand).multiply(
				BigDecimal.valueOf(multiplier));
		return setScale(product, scale).doubleValue();
	}

	/**
	 * 求商:四舍五入,根据参数scale确定小数点后保留有效数字位数
	 * 
	 * @param dividend
	 *            被除数
	 * @param divisor
	 *            除数
	 * @param scale
	 *            刻度、数值范围
	 * @return 商
	 */
	public static double divide(double dividend, double divisor, int scale) {
		int roundingMode = BigDecimal.ROUND_HALF_UP;
		BigDecimal quotient = BigDecimal.valueOf(dividend).divide(
				BigDecimal.valueOf(divisor), scale, roundingMode);
		return quotient.doubleValue();
	}

	/**
	 * 求和,没有限制
	 * 
	 * @param addend
	 *            加数
	 * @param augend
	 *            被加数
	 * @return 和
	 */
	public static double addWithoutRestriction(double addend, double augend) {
		BigDecimal sum = BigDecimal.valueOf(addend).add(
				BigDecimal.valueOf(augend));
		return sum.doubleValue();
	}

	/**
	 * 求差,没有限制
	 * 
	 * @param minuend
	 *            被减数
	 * @param subtrahend
	 *            减数
	 * @return 差
	 */
	public static double subtractWithoutRestriction(double minuend,
			double subtrahend) {
		BigDecimal difference = BigDecimal.valueOf(minuend).subtract(
				BigDecimal.valueOf(subtrahend));
		return difference.doubleValue();
	}

	/**
	 * 求积,没有限制
	 * 
	 * @param multiplicand
	 *            被乘数
	 * @param multiplier
	 *            乘数
	 * @return 积
	 */
	public static double multiplyWithoutRestriction(double multiplicand,
			double multiplier) {
		BigDecimal product = BigDecimal.valueOf(multiplicand).multiply(
				BigDecimal.valueOf(multiplier));
		return product.doubleValue();
	}

	/**
	 * 求商,没有限制
	 * 
	 * @param dividend
	 *            被除数
	 * @param divisor
	 *            除数
	 * @return 商
	 * @throws ArithmeticException
	 *             当准确的商值没有无穷的十进制扩展 或者 divisor==0
	 */
	public static double divideWithoutRestriction(double dividend,
			double divisor) throws ArithmeticException {
		BigDecimal quotient = BigDecimal.valueOf(dividend).divide(
				BigDecimal.valueOf(divisor));
		return quotient.doubleValue();
	}

	/**
	 * 求相反数
	 * 
	 * @param val
	 *            数值
	 * @return 相反数
	 */
	public static double negate(double val) {
		BigDecimal negate = BigDecimal.valueOf(val).negate();
		return setScale(negate).doubleValue();
	}

	/**
	 * 求相反数,根据参数scale确定小数点后保留有效数字位数
	 * 
	 * @param val
	 *            数值
	 * @param scale
	 *            刻度、数值范围
	 * @return
	 */
	public static double negate(double val, int scale) {
		BigDecimal negate = BigDecimal.valueOf(val).negate();
		return setScale(negate, scale).doubleValue();
	}

	/**
	 * 四舍五入,小数点后保留两位有效数字
	 * 
	 * @param val
	 *            数字
	 * @return 四舍五入,小数点后保留两位有效数字后的数字
	 */
	public static BigDecimal setScale(BigDecimal val) {
		return val.setScale(PRECISION_TWO, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 四舍五入,根据参数scale确定小数点后保留有效数字位数
	 * 
	 * @param val
	 *            数字
	 * @param scale
	 *            小数点后保留有效数字的位数
	 * @return
	 */
	public static BigDecimal setScale(BigDecimal val, int scale) {
		return val.setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式.
	 * 
	 * @param amount
	 *            金额数字
	 * @return 中文大写
	 * @throws IllegalArgumentException
	 */
	public static String convert(String amount) throws IllegalArgumentException {
		String result = "";
		String integer = ""; // 整数部分
		String fraction = ""; // 小数部分
		boolean isNegative = false;
		// 去掉分隔符
		amount = amount.replace(",", "");
		// 去掉负号
		if (!(amount.indexOf("-") == -1)) {
			amount = amount.replace("-", "");
			isNegative = true;
		}
		// 验证金额正确性
		if (!checkNum(amount))
			throw new NumberFormatException("非法数据,请检查!");

		if (Double.valueOf(amount) == 0) {
			return result = "零元整";
		}
		if (amount.indexOf(".") == -1) {
			integer = amount;
			fraction = "00";
		} else {
			int index = amount.indexOf(".");
			integer = amount.substring(0, index);
			fraction = amount.substring(index + 1);
		}
		if (!integer.equals("0")) {
			result += integer2rmb(integer) + UNITS[0]; // 整数部分
		}
		if (fraction.equals("00")) {
			result += UNITS[3]; // 添加[整]
		} else if (fraction.startsWith("0") && integer.equals("0")) {
			result += fraction2rmb(fraction).substring(1); // 去掉分前面的[零]
		} else {
			result += fraction2rmb(fraction); // 小数部分
		}
		if (isNegative) {
			return "负".concat(result);
		}

		return result;
	}

	// 将金额小数部分转换为中文大写
	private static String fraction2rmb(String fraction) {
		char jiao = fraction.charAt(0); // 角
		char fen = fraction.charAt(1); // 分
		return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : ""))
				+ (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");
	}

	// 将金额整数部分转换为中文大写
	private static String integer2rmb(String integer) {
		StringBuilder buffer = new StringBuilder();
		// 从个位数开始转换
		int i, j;
		for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {
			char n = integer.charAt(i);
			if (n == '0') {
				// 当n是0且n的右边一位不是0时,插入[零]
				if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {
					buffer.append(RMB_NUMS[0]);
				}
				// 插入[万]或者[亿]
				if (j % 4 == 0) {
					if (i > 0 && integer.charAt(i - 1) != '0' || i > 1
							&& integer.charAt(i - 2) != '0' || i > 2
							&& integer.charAt(i - 3) != '0') {
						buffer.append(U2[j / 4]);
					}
				}
			} else {
				if (j % 4 == 0) {
					buffer.append(U2[j / 4]); // 插入[万]或者[亿]
				}
				buffer.append(U1[j % 4]); // 插入[拾]、[佰]或[仟]
				buffer.append(RMB_NUMS[n - '0']); // 插入数字
			}
		}
		return buffer.reverse().toString();
	}

	/**
	 * 判断用户输入的数据是否合法,用户只能输入大于零的数字,不能输入其它字符
	 * 
	 * @param s
	 *            String
	 * @return 如果用户输入数据合法,返回 true,否则返回 false
	 */
	private static boolean checkNum(String s) {
		// 如果用户输入的数里有非数字字符,则视为非法数据,返回 false
		try {

			if (s.indexOf(".") == -1) {
				if (s.length() >= 13) {
					LogTools.debug("整数位大于11位");
					return false;
				}
			} else {
				int fractionDigits = s.length() - s.indexOf(".") - 1;
				if (s.indexOf(".") >= 13) {
					LogTools.debug("整数位大于11位");
					return false;
				} else if (fractionDigits > 2) {
					LogTools.debug("小数位多于两位。");
					return false;
				}
			}

			Double.valueOf(s);
			return true;
		} catch (NumberFormatException e) {
			LogTools.debug("非法数据,请检查!");
			return false;
		}
	}
}

分享到:
评论

相关推荐

    数字信号处理实习实验一信号的时域处理MATLAB

    1. **熟悉常见离散时间信号的产生方法**:离散时间信号是数字信号处理的基础,包括单位脉冲序列、正弦波、矩形波等。在MATLAB中,可以使用`ones`,`sin`,`rectpuls`等函数来创建这些基本信号。 2. **熟悉离散时间...

    数字信号处理实习 讲义3

    数字信号处理实习的讲义第三部分主要探讨了滤波这一关键概念,特别是FIR(有限长单位脉冲响应)和IIR(无限长单位脉冲响应)滤波器的区别以及FIR滤波器的设计方法。滤波在数字信号处理中扮演着至关重要的角色,广泛...

    通信实习报告 单位实习报告

    【通信实习报告 单位实习报告】 实习报告是学习与实践相结合的重要环节,特别是对于通信工程专业的学生来说,深入理解并应用所学理论知识至实际工作中至关重要。以下将围绕通信工程实习中的关键知识点进行详细阐述...

    数字信号处理实习实验二离散信号的频谱分析MATLAB.zip

    在"数字信号处理实习实验二离散信号的频谱分析MATLAB"中,我们将探讨如何利用MATLAB进行离散信号的频谱分析。 首先,离散信号是时间上离散的信号,通常由采样过程得到,它的值只在特定的时间点上被定义。在MATLAB中...

    数字图像处理的课件PPT

    根据提供的信息,我们可以总结出以下关于“数字图像处理”的详细知识点: ### 数字图像处理概览 #### 课程基本信息 - **课程名称**:“数字图像处理” - **主讲人**:郑宏 - **所在单位**:武汉大学电子信息学院 ...

    数字信号处理实践方法(第二版)例子程序(Matlab版)

    ### 数字信号处理实践方法(第二版)例子程序(Matlab版) #### 知识点概述 本篇文章将根据《数字信号处理实践方法(第二版)》中的Matlab示例程序来解析数字信号处理中的几个核心概念和技术实现。本书由E.C. Ifeachor和...

    毕业实习报告-数字媒体字数-4600字.doc

    在实习单位和岗位方面,学生可能会面临大学所学与实际工作的脱节,但通过适应和调整,可以逐渐融入工作环境。例如,可能需要参加专业岗位的岗前培训,以了解并适应计算科学与技术以及数字媒体技术的专业要求。在这个...

    软件实习代码

    这里的"软件实习代码"涵盖了四个主要项目:学生管理系统、扑克牌操作、算术表达式处理以及坐标点的距离计算。每个项目都对应一个核心的编程知识点,下面将分别进行详细介绍。 首先,学生管理系统是一个常见的软件...

    生产实习通信工程.zip

    1. 实习单位简介:介绍实习所在的通信公司或机构的基本情况,如主营业务、技术水平、组织结构等。 2. 实习岗位职责:详细描述实习生在实习期间所承担的任务,例如参与通信网络的建设和维护、信号处理、通信设备调试...

    数字逻辑课程设计+实习报告

    在本“数字逻辑课程设计+实习报告”中,我们将探讨两个关键的数字逻辑系统:数字时钟和四位加法器。这两个项目是电子工程和计算机科学领域的基础,它们涉及到数字电路设计、逻辑门操作以及数字信号处理等核心概念。 ...

    事业单位会计实习心得三篇.doc

    实习单位的领导和同事们的关心与指导,也让实习生感受到了职场文化的魅力,学会了如何在团队中发挥作用,提升了沟通和适应能力。 总结来说,事业单位会计实习是一次宝贵的经历,它让实习生从理论走向实践,从课堂...

    数字测图软件实训实习指导书.doc

    1. 数字化测图软件CASS的内业成图训练:学生以小组为单位,整理野外测量的数据和草图,使用CASS软件进行内业编辑,确保符合图式要求。通过这个过程,学生能更好地理解和运用软件,提升综合制图能力。 2. 简编码数字...

    工厂会计实习单位实训说明.doc

    【工厂会计实习单位实训说明】 实习是理论与实践相结合的重要环节,通过在巩义市亚欣炉料厂的会计实习,我深入理解了会计在实际工作中的应用,体验了会计人员的责任与挑战。该厂拥有先进的生产设备和检测手段,与多...

    毕业实习日记

    - **信号处理**:包括数字信号处理、模拟信号处理等,主要目的是对信号进行分析、转换或增强。 - **网络技术**:如计算机网络、移动通信网络等,重点在于网络架构设计、网络优化等方面。 - **无线通信**:涉及无线...

    毕业实习报告机械类.pdf

    实际的实习报告内容应该会更加详尽和系统,包含实习单位介绍、实习内容、学习成果以及对于实习经历的个人反思和总结。在撰写正式报告时,学生们需要确保信息的准确性,并且把实习中遇到的实际问题和解决办法详细记录...

    实习总结报告工作单位感悟汇总.docx

    报告中详细描述了实习的时间、实习单位的背景以及在实习期间的具体工作内容,包括对会计流程的进一步理解和工作中遇到的问题。 正文: 实习是每个大学生从校园走向社会的重要桥梁,它让我们从理论学习迈向实际操作...

    电气自动化实习报告范文

    - **实习单位简介**:介绍实习单位的基本情况,包括但不限于单位名称、主营业务、规模等。 - **实习内容**:详细记录实习期间参与的主要工作项目、具体任务及完成情况。 - **实习心得**:总结实习过程中的体会与...

    JSP MYSQL学生实习管理系统 源代码

    实习反馈管理则让学生可以对实习单位、指导老师等进行评价,为改进实习质量提供参考。 对于教师用户,他们主要负责学生实习评价管理。教师可以通过系统查看学生的实习日志,根据学生的工作表现给出评价,评估学生的...

    信息科学技术实习报告

    5. Adobe Photoshop CS6是图像处理的行业标准,用于编辑和创作数字图像,是创意设计的重要组成部分。 6. PowerDesigner则是一款强大的数据库建模工具,允许用户在概念数据模型和物理数据模型之间进行设计,对于...

Global site tag (gtag.js) - Google Analytics