package com.steering.common;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;



/**
 * StringTool.java 字符串处理类
 * 
 * @author siy 2014/09/20
 * @version v1.0
 * @modify
 */
public class StringTool {
	/** 自增变量 */
	private static int _INCREMENTVALUE = 0;
	/** 数字转符格式字符串 */
	private static NumberFormat _NUMBERFORMAT = null;
	static {
		_NUMBERFORMAT = NumberFormat.getInstance();
		_NUMBERFORMAT.setMinimumIntegerDigits(3);
		_NUMBERFORMAT.setMaximumIntegerDigits(3);
	}

	/**
	 * 判断字符串是否为空
	 * 
	 * @param str
	 *            String
	 * @return boolean
	 */
	public static boolean isNullOrEmpty(String str) {
		return str == null || str.equals("");
	}

	/**
	 * 返回字符串副本，null转为""
	 * 
	 * @param obj
	 *            object
	 * @return String
	 */
	public static String nullToEmpty(Object obj) {
		return obj == null ? "" : obj.toString();
	}

	/**
	 * 判断字符串是否是整数
	 * 
	 * @param str
	 *            String
	 * @return boolean
	 */
	public static boolean isInteger(String str) {
		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]+$");
		return pattern.matcher(str).matches();
	}

	/**
	 * 判断字符串是否是小数
	 * 
	 * @param str
	 *            String
	 * @return boolean
	 */
	public static boolean isDouble(String str) {
		Pattern pattern = Pattern.compile("^[-\\+]?\\d+\\.\\d+$");
		return pattern.matcher(str).matches();
	}

	/**
	 * 判断字符串是否是数字
	 * 
	 * @param str
	 *            String
	 * @return boolean
	 */
	public static boolean isNumeric(String str) {
		return isInteger(str) || isDouble(str);
	}

	/**
	 * 人民币转换成大写
	 * 
	 * @param str
	 *            String 人民币数字
	 * @return String 人民币中文大写
	 */
	public static String hangeToBig(String str) {
		double value;
		try {
			value = Double.parseDouble(str.trim());
		} catch (Exception e) {
			return null;
		}
		char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
		char[] vunit = { '万', '亿' }; // 段名表示
		char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
		long midVal = (long) (value * 100); // 转化成整形
		String valStr = String.valueOf(midVal); // 转化成字符串

		String head = valStr.substring(0, valStr.length() - 2); // 取整数部分
		String rail = valStr.substring(valStr.length() - 2); // 取小数部分

		String prefix = ""; // 整数部分转化的结果
		String suffix = ""; // 小数部分转化的结果
		// 处理小数点后面的数
		if (rail.equals("00")) { // 如果小数部分为0
			suffix = "整";
		} else {
			suffix = digit[rail.charAt(0) - '0'] + "角"
					+ digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
		}
		// 处理小数点前面的数
		char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
		char zero = '0'; // 标志'0'表示出现过0
		byte zeroSerNum = 0; // 连续出现0的次数
		for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字
			int idx = (chDig.length - i - 1) % 4; // 取段内位置
			int vidx = (chDig.length - i - 1) / 4; // 取段位置
			if (chDig[i] == '0') { // 如果当前字符是0
				zeroSerNum++; // 连续0次数递增
				if (zero == '0') { // 标志
					zero = digit[0];
				} else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
					prefix += vunit[vidx - 1];
					zero = '0';
				}
				continue;
			}
			zeroSerNum = 0; // 连续0次数清零
			if (zero != '0') { // 如果标志不为0,则加上,例如万,亿什么的
				prefix += zero;
				zero = '0';
			}
			prefix += digit[chDig[i] - '0']; // 转化该数字表示
			if (idx > 0) {
				prefix += hunit[idx - 1];
			}
			if (idx == 0 && vidx > 0) {
				prefix += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿
			}
		}

		if (prefix.length() > 0) {
			prefix += '圆'; // 如果整数部分存在,则有圆的字样
		}
		return prefix + suffix; // 返回正确表示
	}

	/**
	 * 数字格式化
	 * 
	 * @param value
	 *            需转换的数字double
	 * @param pattern
	 *            字符串格式，如"###,###.###","###","000","000,000","000.###%",
	 *            "###.###\u2030"
	 * @return String 格式化字符串
	 */
	public static String formatDecimal(double value, String pattern) {
		DecimalFormat df = new DecimalFormat(pattern);
		return df.format(value);
	}

	/**
	 * 生成服务端唯一编码
	 * 
	 * @return String
	 */
	public static String getUUID() {
		String str = new java.text.SimpleDateFormat("yyyyMMddHHmmss")
				.format(java.util.Calendar.getInstance().getTime());
		return str + getIncrementValue();
	}

	/**
	 * 1-999循环增加
	 * 
	 * @return String
	 */
	private static String getIncrementValue() {
		if (_INCREMENTVALUE == 999) {
			_INCREMENTVALUE = 0;
		}

		return _NUMBERFORMAT.format(++_INCREMENTVALUE);
	}

	/**
	 * 替换所有的字段参数，并且转义单引号。以在sql中识别单引号。
	 * 
	 * @param str
	 *            原始sql
	 * @param oldStr
	 *            旧值
	 * @param newStr
	 *            新值
	 * @return 替换成功的sql
	 */
	public static String ReplaceAll(String str, String oldStr, String newStr) {
		newStr = newStr.replaceAll("'", "''");
		newStr = newStr.replaceAll("&", "' || '&' || '");
		return str.replaceAll(oldStr, newStr);
	}
	
	/**
	 * 结转年月调整25号
	 * @param date
	 * @return
	 */
	public static String GetBalYear(Date date,String supplyUnit) {
   	 SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyyMM", Locale.CHINA);
   	Calendar cal = Calendar.getInstance();
   	cal.setTime(date);
   	if(supplyUnit.equals("120501")){ //天津本部25号12点结账
   	cal.add(Calendar.HOUR, 12);
   	cal.add(Calendar.DATE, -25);
   	cal.add(Calendar.MONTH , 1);
   	}else{//天淮22号16点结账
   	// 天淮结转年月 22日21小时
        cal.add(Calendar.HOUR, 3);
        cal.add(Calendar.DATE, -24);
        cal.add(Calendar.MONTH, 1);
   	}
       return dateFormat.format(cal.getTime());
   }
	/**
	 * 结转年月调整25号
	 * @param date
	 * @return
	 */
	public static String GetBalYear(String supplyUnit) {
	       return GetBalYear( new Date(),supplyUnit);
	   }
	
	/**
	 * 产线判断制造商
	 * @param PlineCode
	 * @return
	 */
	public static String GetSupplyUnit(String PlineCode) {
		String supplyUnit = "";
		if(PlineCode.equals("C072") ||PlineCode.equals("C091") ||PlineCode.equals("C092")||PlineCode.equals("C102")||PlineCode.equals("C099")||PlineCode.equals("C100")||PlineCode.equals("C102")||PlineCode.equals("C103")||PlineCode.equals("C104")||PlineCode.equals("C107")){
			supplyUnit = "120504";
		}else{
			supplyUnit = "120501";
		}
	       return supplyUnit;
	   }
	
	/**
	 * 班次班组中文转换数字
	 * @param str
	 * @return
	 */
	public static String ChangColShift(String str) {
		String reStr = "";
		if(str.equals("早班")){
			reStr = "1";
		}else if(str.equals("中班")){
			reStr = "2";
		}else if(str.equals("夜班")){
			reStr = "3";
		}else if(str.equals("白班")){
			reStr = "0";
		}else if(str.equals("常白班")){
			reStr = "0";
		}else if(str.equals("甲")){
			reStr = "1";
		}else if(str.equals("乙")){
			reStr = "2";
		}else if(str.equals("丙")){
			reStr = "3";
		}else if(str.equals("丁")){
			reStr = "4";
		}else{
			reStr = str;
		}
	       return reStr;
	 }
}
