一、寫入Excel,並加密壓縮、不保存文件java
String dcxh = String.format("%03d", keyValue);apache
String folderFileName="Q10152900H1I002016060071.zip";數組
File file=new File(folderFileName+".xls");
fos=new FileOutputStream(file);
//設置sheet 頁中文名字
workbook.setSheetName(0, "身份信息");app
workbook.write(fos);//寫入文件
workbook.close();
fos.flush();
fos.close();ide
/*將生成的Excel文件壓縮成同名的zip 文件 加密密碼:dddd*/
String zipFileName=folderFileName+".zip";ui
zipFile=StringOperator.addFilesWithAESEncryptionByStream(file,zipFileName,zippassword);//經過文件流加密加密
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.addHeader("Content-disposition", "attachment;filename="+folderFileName+".zip");
is=new FileInputStream(zipFile.getFile());
bis=new BufferedInputStream(is);
os=response.getOutputStream();
bos=new BufferedOutputStream(os);
int read=0;
byte[] bytes=new byte[8072];
while ((read=bis.read(bytes, 0, bytes.length))!=-1) {
bos.write(bytes, 0, read);
}
bos.flush();3d
二、加密碼壓縮並保存源文件和壓縮文件excel
String realPath = request.getSession().getServletContext().getRealPath("/");
// String realPath=getClass().getResource("/").getFile().toString();code
String nowDateStr=DateUtils.getSysDateTime("yyyyMM");//當前日期
String folderFileName=orgcode+nowDateStr+dcxh+"1";
/**根據路徑**/
String filePath=rootPath+"/"+folderFileName;
StringOperator.deletePath(filePath);
File file=new File(filePath);
file.delete();
FileUtil.mkDirs(filePath);
String fileName=filePath+"/"+folderFileName+".xls";
fos=new FileOutputStream(fileName);
workbook.setSheetName(0, "身份信息");
workbook.write(fos);//寫入文件
workbook.close();
fos.flush();
fos.close();
/*將生成的Excel文件壓縮成同名的zip 文件 加密密碼:ddddd*/
String zipFileName=folderFileName+".zip";
//在對應Excel文件的同目錄下生成對應的同名的zip壓縮文件
//StringOperator.zip(fileName, filePath+File.separator+zipFileName);//未加密
StringOperator.addFilesWithAESEncryption(fileName,zipFileName,filePath,zippassword);//加密
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.addHeader("Content-disposition", "attachment;filename="+folderFileName+".zip");
is=new FileInputStream(zipFile.getFile());
bis=new BufferedInputStream(is);
os=response.getOutputStream();
bos=new BufferedOutputStream(os);
int read=0;
byte[] bytes=new byte[8072];
while ((read=bis.read(bytes, 0, bytes.length))!=-1) {
bos.write(bytes, 0, read);
}
bos.flush();
===============文件操做類===================
package com.chinazyjr.common;
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern;
import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.util.Zip4jConstants;
import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Expand; import org.apache.tools.ant.taskdefs.Zip; import org.apache.tools.ant.types.FileSet; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream;
public class StringOperator { public StringOperator() { } public static void main(String args[]){
String b="上海市嘉定區新鬱路68弄"; String c="(人民幣)叄萬元整"; String a="23.46"; //System.out.println("dddd="+getDimeConvertPenny(new Double("18989.99").doubleValue())); //System.out.println("dddd="+getPennyConvertDime(new Double("1019.00").doubleValue())); double f=2.34; //if(f==0){ //DecimalFormat format = new DecimalFormat("##0"); String w="23400.33"; String w1="2222.00"; String w2="5000.00"; String w3="60000.00"; System.out.println("endRec=="+ getUpInt(w)); System.out.println("endRec=="+ getUpInt(w1)); System.out.println("endRec=="+ getUpInt(w2)); System.out.println("endRec=="+ getUpInt(w3));
//System.out.println("endRec=="+GetFindCount("安徽省市廬陽區合瓦路251號1幢1號","合肥")); String x="安徽省合肥市廬陽區合瓦路251號1幢1號"; String v="合肥"; if(x.indexOf(v)!=-1){ System.out.println("aaaa=="); } //} /*int excelDiv=60000; int recordDiv=3; for(int i=0;i<recordDiv;i++){ int startRec=excelDiv*i+1; int endRec=excelDiv*(i+1); System.out.println("startRec=="+startRec); System.out.println("endRec=="+endRec); } */ } /** * 功能:獲取整數:例如2222.00爲3000 * @param str String * @return 返回int類型 */ public static int getUpInt(String str) { int rslt = 0; if (str == null || str.trim().equals("")) { return rslt; } str = str.trim(); int pos=str.indexOf("."); String startStr=str.substring(0,pos); // 5500 // 23300 if(startStr.length()<=3){ rslt=1000; } else{ String beginStr=startStr.substring(0,startStr.length()-3); String endStr=startStr.substring(startStr.length()-3); if(endStr.equals("000")){ rslt=new Integer(startStr).intValue(); } else{ Integer upInteger=new Integer(beginStr)+1; String tempStr=upInteger.toString()+"000"; rslt=new Integer(tempStr).intValue(); } }
return rslt; } /** * 功能:獲取整數:例如22.33結果爲23,22.00爲22 * @param str String * @return 返回int類型 */ public static int getInt(String str) { int rslt = 0; if (str == null || str.trim().equals("")) { return rslt; } str = str.trim(); int pos=str.indexOf("."); String startStr=str.substring(0,pos); String endStr=str.substring(pos+1); if (new Long(endStr)>0) { rslt=new Integer(startStr).intValue()+1; } else{ rslt=new Integer(startStr).intValue(); } return rslt; }
//元轉分 public static long getDimeConvertPenny(double dime){ double d = 0; if(dime!=0){ String dimeStr=String.valueOf(dime); String[] dimeAry=dimeStr.split("\\."); int len=dimeAry.length; if(len==1){ d=new Double(dimeStr+"00").doubleValue(); } else{ int dimePenny=new Integer(dimeAry[1]).intValue(); if(dimePenny==0){ d=new Double(dimeAry[0]+"00").doubleValue(); } else{ int length=dimeAry[1].length(); if(length==1){ d=new Double(dimeAry[0]+dimeAry[1]+"0").doubleValue(); } else{ d=new Double(dimeAry[0]+dimeAry[1]).doubleValue(); } } } } return (long)d; } //分轉元 public static double getPennyConvertDime(double dime){ double d = 0; if(dime!=0){ String dimeStr=String.valueOf((long)dime); String[] dimeAry=dimeStr.split("\\."); int len=dimeAry.length; String tempDimeStr1=""; String tempDimeStr2=""; if(len==1){ if(dimeStr.length()==1){ tempDimeStr2="0"+dimeStr; } else{ tempDimeStr1=dimeStr.substring(0,dimeStr.length()-2); tempDimeStr2=dimeStr.substring(dimeStr.length()-2); } } else{ if(dimeAry[0].length()==1){ tempDimeStr2="0"+dimeAry[0]; } else{ tempDimeStr1=dimeAry[0].substring(0,dimeAry[0].length()-2); tempDimeStr2=dimeAry[0].substring(dimeAry[0].length()-2); } } d=new Double(tempDimeStr1+"."+tempDimeStr2).doubleValue(); } return d; } public static int getStringNumber(String stringNum){ String str = null; int num = 0; if(stringNum != null){ for(int i = 0; i < stringNum.length(); i++) { char c = stringNum.charAt(i); if(c >= '0' && c <= '9' || c == '.'){ if(str != null){ str = str + Character.toString(c); } else{ str = Character.toString(c); } } } if(str != null){ num = Integer.parseInt(str); } } return num; } /** * 刪除單個文件 * @param sPath 被刪除文件的文件名 * @return 單個文件刪除成功返回true,不然返回false */ public static boolean deleteFile(String sPath) { boolean flag = false; File file = new File(sPath); // 路徑爲文件且不爲空則進行刪除 if (file.isFile() && file.exists()) { file.delete(); flag = true; } return flag; } //刪除目錄下文件 public static void deletePath(String filepath) throws Exception { File f = new File(filepath);//定義文件路徑 if(f.exists() && f.isDirectory()){//判斷是文件仍是目錄 //如有則把文件放進數組,並判斷是否有下級目錄 File delFile[]=f.listFiles(); int i =f.listFiles().length; for(int j=0;j<i;j++){ if(delFile[j].isDirectory()){ deletePath(delFile[j].getAbsolutePath());//遞歸調用del方法並取得子目錄路徑 } delFile[j].delete();//刪除文件 } } }
/** * 解壓縮 * @param destDir 生成的目標目錄下 c:/a * @param sourceZip 源zip文件 c:/upload.zip * 結果則是 將upload.zip文件解壓縮到c:/a目錄下 */ public static void unZip(String destDir,String sourceZip){ try{ Project prj1 = new Project(); Expand expand = new Expand(); expand.setProject(prj1); expand.setEncoding("GBK"); expand.setSrc(new File(sourceZip)); expand.setOverwrite(false);//是否覆蓋 File f = new File(destDir); expand.setDest(f); expand.execute(); } catch(Exception e) { e.printStackTrace(); } } /** * 壓縮 指定文件 * * @param sourceFile * 壓縮的源文件 如: c:/upload * @param targetZip * 生成的目標文件 如:c:/upload.zip */ public static void zip(String sourceFile,String targetZip){ Project prj = new Project(); Zip zip = new Zip(); zip.setProject(prj); zip.setDestFile(new File(targetZip));//設置生成的目標zip文件File對象 FileSet fileSet = new FileSet(); fileSet.setProject(prj); fileSet.setFile(new File(sourceFile)); zip.addFileset(fileSet); zip.execute(); } /** * 壓縮 指定目錄下的文件 * * @param sourceFile * 壓縮的源文件 如: c:/upload * @param targetZip * 生成的目標文件 如:c:/upload.zip */ public static void zipDir(String sourceFile,String targetZip){ Project prj = new Project(); Zip zip = new Zip(); zip.setProject(prj); zip.setDestFile(new File(targetZip));//設置生成的目標zip文件File對象 FileSet fileSet = new FileSet(); fileSet.setProject(prj); fileSet.setDir(new File(sourceFile));//設置將要進行壓縮的源文件File對象 zip.addFileset(fileSet); zip.execute(); } /** * Desc:加密壓縮ZIP文件 * @author chen_xhua * @date 2016年5月27日 * @param sourcefile 要壓縮的具體路徑+文件 D:\\aaa.xls * @param zipFileName 壓縮後的文件名.zip aaa.zip * @param targetFilePath 壓縮到的文件目錄 D:\\ * void */ public static void addFilesWithAESEncryption(String sourcefile,String zipFileName,String targetFilePath,String zippassword) { try { ZipFile zipFile = new ZipFile(targetFilePath+File.separator+zipFileName); ArrayList<File> filesToAdd = new ArrayList<File>(); filesToAdd.add(new File(sourcefile)); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); parameters.setPassword(zippassword); zipFile.addFiles(filesToAdd, parameters); } catch (Exception e) { e.printStackTrace(); } } /** * Desc:根據文件流 加密壓縮ZIP文件 * @author chen_xhua * @date 2016年6月20日 * @param file * @param zipFileName * @param zippassword * @return ZipFile * */ public static ZipFile addFilesWithAESEncryptionByStream(File file,String zipFileName,String zippassword) { ZipFile zipFile = null; try { zipFile = new ZipFile(zipFileName); ArrayList<File> filesToAdd = new ArrayList<File>(); filesToAdd.add(file); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); parameters.setPassword(zippassword); zipFile.addFiles(filesToAdd, parameters); } catch (Exception e) { e.printStackTrace(); } return zipFile; } /** * 實現將多個文件進行壓縮,生成指定目錄下的指定名字的壓縮文件 * Parameters: * filename :指定生成的壓縮文件的名稱 * dirPath :指定生成的壓縮文件所存放的目錄 * list :List集合:用於存放多個File(文件) * author:chen_xhua 2016-05-25 * */
public static void createZip(String fileName, String dirPath,List<File> list) { File file = new File(dirPath); System.err.println(dirPath); File zipFile = new File(dirPath+File.separator+fileName); InputStream input = null; try { ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); zipOut.setEncoding(System.getProperty("sun.jnu.encoding")); zipOut.setComment(file.getName()); if (file.isDirectory()) { for (int i = 0; i < list.size(); ++i) { input = new FileInputStream(list.get(i)); zipOut.putNextEntry(new ZipEntry( file.getName()+ File.separator + list.get(i).getName())); int temp = 0; while ((temp = input.read()) != -1) { System.out.println("sss"+temp); zipOut.write(temp); } input.close(); System.out.println("["+list.get(i).getName()+"] zip to File:["+fileName+"] success "); } } zipOut.close(); } catch (Exception e) { } }
public static String getSubString(String str,int pstart,int pend){ String resu=""; int beg=0; int end=0; int count1=0; char[] temp=new char[str.length()]; str.getChars(0,str.length(),temp,0); boolean[] bol=new boolean[str.length()]; for(int i=0;i<temp.length;i++){ bol[i]=false; if((int)temp[i]>255){//說明是中文 count1++; bol[i]=true; } }
if(pstart>str.length()+count1){ resu=null; } if(pstart>pend){ resu=null; } if(pstart<1){ beg=0; }else{ beg=pstart-1; } if(pend>str.length()+count1){ end=str.length()+count1; }else{ end=pend;//在substring的末尾同樣 } //下面開始求應該返回的字符串 if(resu!=null){ if(beg==end){ int count=0; if(beg==0){ if(bol[0]==true) resu=null; else resu=new String(temp,0,1); }else{ int len=beg;//zheli for(int y=0;y<len;y++){//表示他前面是否有中文,無論本身 if(bol[y]==true) count++; len--;//想明白爲何len-- } //for循環運行完畢後,len的值就表明在正常字符串中,目標beg的上一字符的索引值 if(count==0){//說明前面沒有中文 if((int)temp[beg]>255)//說明本身是中文 resu=null;//返回空 else resu=new String(temp,beg,1); }else{//前面有中文,那麼一箇中文應與2個字符相對 if((int)temp[len+1]>255)//說明本身是中文 resu=null;//返回空 else resu=new String(temp,len+1,1); } } }else{//下面是正常狀況下的比較 int temSt=beg; int temEd=end-1;//這裏減掉一 for(int i=0;i<temSt;i++){ if(bol[i]==true) temSt--; }//循環完畢後temSt表示前字符的正常索引 for(int j=0;j<temEd;j++){ if(bol[j]==true) temEd--; }//循環完畢後temEd-1表示最後字符的正常索引 if(bol[temSt]==true)//說明是字符,說明索引自己是漢字的後半部分,那麼應該是不能取的 { int cont=0; for(int i=0;i<=temSt;i++){ cont++; if(bol[i]==true) cont++; } if(pstart==cont)//是偶數不該包含,若是pstart<cont則要包含 temSt++;//從下一位開始 } if(bol[temEd]==true){//由於temEd表示substring 的最面參數,此處是一個漢字,下面要肯定是否應該含這個漢字 int cont=0; for(int i=0;i<=temEd;i++){ cont++; if(bol[i]==true) cont++; } if(pend<cont)//是漢字的前半部分不該包含 temEd--;//因此只取到前一個 } if(temSt==temEd){ resu=new String(temp,temSt,1); }else if(temSt>temEd){ resu=null; }else{ resu=str.substring(temSt,temEd+1); } } } return resu;//返回結果 } /** * @param str * 字符串 * 須要截取的字節數 * @return 中文字符串長度 */ public static int getSubStringLen(String str) { if (null == str) { return 0; } // 截取了的字節數 int len = 0; for (char c : str.toCharArray()) { if (isChinese(c)) { // 若是是中文,字節數加2 len += 2; } else { // 若是不是中文,字節數加1 len++; } } return len; } /** * @param str * 字符串 * @param bytes * 須要截取的字節數 * @return 結果 */ public static String getSubString(String str, int bytes) { if (null == str) { return null; } StringBuffer sb = new StringBuffer(); // 截取了的字節數 int len = 0; for (char c : str.toCharArray()) { if (isChinese(c)) { // 若是是中文,字節數加2 len += 2; } else { // 若是不是中文,字節數加1 len++; } if (len > bytes) { // 若是字節數大於了須要截取的,則終止 break; } else { sb.append(c); } } return sb.toString(); } /** * 判斷一個字符是否是中文 */ public static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { return true; } return false; }
public static int getMaxValue(int[] dataAry){ int max=dataAry[0]; for(int i=0;i<dataAry.length;i++) { if(max<dataAry[i]) max = dataAry[i]; } return max; } public static String getNumberFormatStr(double d){ NumberFormat currentFormat=NumberFormat.getInstance(); String str=currentFormat.format(new Double(d)); return str; } /** * 查找某一字符串中TempString,特定子串TempSubString的出現次數 * @param TempString: 字符串 * @param TempSubString: 子串 * @return: 次數 */ public static int GetFindCount(String TempString,String TempSubString){ if(TempString==null) return 0; StringTokenizer TempStringTokenizer=new StringTokenizer(TempString,TempSubString); return TempStringTokenizer.countTokens(); }
/** * 將字符串定義改成字符串數組 * @param TempString: 字符串 * @param Separator: 分隔符 * @return: 字符串數組 */ public static String[] ChangeStringToArray(String TempString,String Separator){ if(TempString==null || TempString.trim().equalsIgnoreCase("")){ return null; }
int count=0; String CountString = TempString; int loc=0; while (!CountString.equalsIgnoreCase("")) { if (CountString.indexOf(Separator) != -1) { loc = CountString.indexOf(Separator); count++; CountString = CountString.substring(loc + 1); if(CountString.indexOf(Separator)==-1 && CountString.trim().equalsIgnoreCase("")) { count++; } } else { count++; CountString=""; } }
String[] TempStringArray=new String[count]; try { int j=0; for(int i=0;i<count;i++) { if(TempString.indexOf(Separator)!=-1) { j=TempString.indexOf(Separator); TempStringArray[i]=TempString.substring(0,j); TempString=TempString.substring(j+1); }else{ TempStringArray[i]=TempString; } } } catch(Exception e) { System.out.println("轉換的過程當中出現錯誤!"+e.getMessage()); e.printStackTrace(); } return TempStringArray; }
/** * 替換字符串中的子串爲另外一字符串 * @param TempString: 替換字符串 * @param ToReplaceString: 要替換字符串 * @param ReplaceString: 另外一字符串 * @return: 替換後的字符串 */ public static String StringReplace(String TempString,String ToReplaceString,String ReplaceString) { String ReturnString=TempString; int StringLength=0;
if(TempString==null) return null;
if(ToReplaceString!=null) { if(TempString.length()==ToReplaceString.length() && TempString.compareTo(ToReplaceString)==0) { return ReplaceString; }
StringLength=ToReplaceString.length(); } if(ReturnString != null && ReturnString.length()>StringLength) { int max=0; String S4=""; for(int i=0;i<TempString.length();i++) { max=i+ToReplaceString.length()>TempString.length()?TempString.length():i+StringLength; String S3=TempString.substring(i,max); if(!S3.equals(ToReplaceString)) { S4+=S3.substring(0,1); }else{ S4+=ReplaceString; i+=StringLength-1; } } ReturnString=S4; }
return ReturnString; }
/** * 把NULL轉換爲"" * @param TempString: 要轉換的字符串 * @return: 轉換後的字符串 */ public static String ChangeNullToString(String TempString) { if(TempString==null) return ""; return TempString.trim(); }
/** * 字符處理 * @param TempString: 要處理的字符串 * @return: 處理後的字符串 */ public static String GetCnCode(String TempString) {
String CnString=null;
try { if(TempString==null) return null; byte[] TempBytes = TempString.getBytes("ISO8859-1"); CnString=new String(TempBytes,"GB2312"); } catch(Exception e) { System.out.print("字符轉換出錯!"+e.getMessage()); e.printStackTrace(); }
return CnString; }
/** * 將空字符串——>"0" * @param W_ChangeString:要轉換的字符串 * @return:轉換後的字符串 */ public static String ChangeNullToZero(String W_ChangeString) { if(W_ChangeString==null || W_ChangeString.trim().equalsIgnoreCase("")) { W_ChangeString="0"; }
return W_ChangeString; }
/** * 將科學計數法的double轉換爲正常現實的String * @param tempDoubleValue:要轉換的double * @return:轉換後的String */ public static String ChangeDoubleToString(double tempDoubleValue) { DecimalFormat format=new DecimalFormat("####.00"); String tempString=""; tempString=format.format(tempDoubleValue);
return tempString; }
/** * 按字節截取字符串 * @param tmpStr String * @param beginIndex int * @param endIndex int * @return String */ public static String substringByBytes(String tmpStr,int beginIndex, int endIndex) { byte[] tmpBytes=tmpStr.getBytes(); int len=endIndex-beginIndex; byte[] returnBytes=new byte[len]; System.arraycopy(tmpBytes,beginIndex,returnBytes,0,len);
// int index=0; // for(int i=beginIndex;i<endIndex;++i) // { // returnBytes[index]=tmpBytes[i]; // index++; // }
return new String(returnBytes); }
/** * 向一維數組中加入一項 * @param tempArray:一維數組 * @param tempValue:要添加的項 * @return:新字符串數組 */ public String[] AddNewItemToStringArray(String[] tempArray,String tempValue) { return null; }
public String[][] AddNewItemToStringArray(String[][] tempArray,String[] AddArrayOne,String[] AddArrayTwo) { return null; }
/** * 判斷一個字符是Ascill字符仍是其它字符(如漢,日,韓文字符) * * @param char * c, 須要判斷的字符 * @return boolean, 返回true,Ascill字符 */ public static boolean isLetter(char c) { int k = 0x80; return c / k == 0 ? true : false; }
/** * 獲得一個字符串的長度,顯示的長度,一個漢字或日韓文長度爲2,英文字符長度爲1 * * @param String * s ,須要獲得長度的字符串 * @return int, 獲得的字符串長度 */ public static int length(String s) { if (s == null) return 0; char[] c = s.toCharArray(); int len = 0; for (int i = 0; i < c.length; i++) { len++; if (!isLetter(c[i])) { len++; } } return len; }
/** * 截取一段字符的長度,不區分中英文,若是數字不正好,則少取一個字符位 * * @author patriotlml * @param String * origin, 原始字符串 * @param int * len, 截取長度(一個漢字長度按2算的) * @return String, 返回的字符串 */ public static String substring(String origin, int len) { if (origin == null || origin.equals("") || len<1) return ""; byte[] strByte = new byte[len]; if (len > length(origin)){ return origin;} System.arraycopy(origin.getBytes(), 0, strByte, 0, len); int count = 0; for (int i = 0; i < len; i++) { int value = strByte[i]; if (value < 0) { count++; } } if (count % 2 != 0) { len = (len == 1) ? ++len : --len; } return new String(strByte, 0, len); } /** * * @author Administrator * @version 建立時間:Mar 17, 2010 3:18:01 PM; * @see 將字符串轉換爲整形,若是出現異常,則返回0 * @param sValue * @return */ public static int parseStringToInt(String sValue) { int result = 0; try { result = Integer.parseInt(sValue); } catch (Exception ex) { result = Double.valueOf(parseStringToDouble(sValue)).intValue(); } return result; }
/** * @see * @author Administrator * @version 建立時間:May 20, 2010 3:14:09 PM; * @param sValue * @return */ public static double parseStringToDouble(String sValue) { double result = 0; try { result = Double.parseDouble(sValue); if (Double.isNaN(result)) { result = 0; } } catch (Exception ex) { // ex.printStackTrace(); } return result; } /**
* 提供精確的加法運算。
* @param v1 被加數
* @param v2 加數
* @return 兩個參數的和
*/
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue(); } public static double addRecursion(double v1,int offset){ double d1=0; d1=add(v1,v1); for(int i=2;i<offset;i++){ d1=add(d1,v1); } return d1; } public static double addMore(Map<Integer,Double> map){ double d1=0; int size=map.size(); if(size==1){ d1=map.get(1); } if(size==2){ d1=add(map.get(1),map.get(2)); } if(size>2){ d1=add(map.get(1),map.get(2)); for(int i=3;i<map.size();i++){ d1=add(d1,map.get(i)); } } return d1; }
/**
* 提供精確的減法運算。
* @param v1 減數
* @param v2 bei減數
* @return 兩個參數的差
*/
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue(); } /**
* 提供精確的乘法運算。
* @param v1 被乘數
* @param v2 乘數
* @return 兩個參數的積
*/
public static double mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue(); } /**
* 提供精確的小數位四捨五入處理。
* @param v 須要四捨五入的數字
* @param scale 小數點後保留幾位
* @return 四捨五入後的結果
*/
public static double round(double v,int scale){ if(scale<0){ throw new IllegalArgumentException("The scale must be a positive integer or zero"); }
BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } public static double div(double v1,double v2,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be a positive integer or zero"); }
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); }
/** * @see * @author Administrator * @version 建立時間:May 20, 2010 3:14:09 PM; * @param sValue * @return */ public static String formatStringToDouble(String sValue) { String result = "0"; try { int len = sValue.length(); boolean decimalFlag = false;// 是否爲科學計數法 boolean is_position = false;// 是否爲負數 boolean decimal_positon = false;// 科學計數法的正負之分 boolean isPositionStart = false;// 計數部分小數是否開始 boolean isException = false;// 是否有異常
StringBuffer decimalStrb = new StringBuffer();// 小數部分 StringBuffer positionStrb = new StringBuffer();// 整數部分 StringBuffer z_Strb = new StringBuffer();// 科學計數法部分 for (int i = 0; i < len; i++) { char c = sValue.charAt(i); if (c == '-' && i == 0) { is_position = true; continue; } if (c == 'E')// 科學計數法 { decimalFlag = true; if ((i + 1) < len && sValue.charAt(i + 1) == '-')// 科學計數法爲負數 { decimal_positon = true; i++; } continue; } if (c == '.') { isPositionStart = true; continue; } if (('c' < '0' || c > '9')) { isException = true; break; }
if (decimalFlag) { z_Strb.append(c); continue; } if (isPositionStart) { decimalStrb.append(c); } else { positionStrb.append(c); }
}
if (!isException) { StringBuffer resultstrb = new StringBuffer();
if (decimalFlag)// 爲科學計數法 { int dec_len = parseStringToInt(z_Strb.toString()); if (decimal_positon) { dec_len = -1 * dec_len; } int z_len = positionStrb.length(); int s_len = decimalStrb.length();
resultstrb.append(positionStrb).append(decimalStrb); int add = z_len + dec_len;
if (add <= 0) { for (; add < 0; add++) { resultstrb.insert(0, "0"); } resultstrb.insert(0, "0."); } else { if (add < (z_len + s_len)) { resultstrb.insert(add, "."); } else { for (int k = (add - z_len - s_len); k > 0; k--) { resultstrb.append("0"); } } } } else { if (decimalStrb.length() <= 0) { resultstrb.append(positionStrb); } else { resultstrb.append(positionStrb).append(".").append(decimalStrb); } } if (is_position) { resultstrb.insert(0,"-"); }
result = resultstrb.toString(); }
} catch (Exception ex) { // ex.printStackTrace(); } return result; } public static String getSeq(int seq){ String rslt=""; try{ String seqStr=String.valueOf(seq); if(seqStr.length()==1){ rslt="00000"+seqStr; } if(seqStr.length()==2){ rslt="0000"+seqStr; } if(seqStr.length()==3){ rslt="000"+seqStr; } if(seqStr.length()==4){ rslt="00"+seqStr; } if(seqStr.length()==5){ rslt="0"+seqStr; } if(seqStr.length()==6){ rslt=seqStr; } } catch(Exception e){ e.printStackTrace(); } return rslt; } /**
* 輸出數字的格式,如:1,234,567.89
* @param bd BigDecimal 要格式華的數字
* @param format String 格式 "###,###.00"
* @return String
*/
public static String numberFormat(double d, String format) { BigDecimal bd = new BigDecimal(d); if (bd == null || "0".equals(bd.toString())) {
return "";
}
DecimalFormat bf = new DecimalFormat(format);
return bf.format(bd);
} /**定義數組存放數字對應的大寫 */ private final static String[] STR_NUMBER ={ "零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌", "玖" };
/** 定義數組存放位數的大寫 */ private final static String[] STR_MODIFY ={ "", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟" }; /** 定義數組存放分角的大寫 */ private final static String[] STR_SMALL={"分","角"};
/** * 將一個數字轉化爲金額 * * @param tempNumber 傳入一個double的變量 * @return 返一個轉換好的字符串 */ public static String numberToChinese(double tempNumber){ java.text.DecimalFormat df = new java.text.DecimalFormat("#.##"); String pTemp = String.valueOf(df.format(tempNumber)); StringBuffer sbResult =null; String fraction=getFraction(pTemp); if(fraction.equals("")){ sbResult = new StringBuffer(getSign(pTemp) + getInteger(pTemp)+ "元整"); } else{ sbResult = new StringBuffer(getSign(pTemp) + getInteger(pTemp) + "元" + getFraction(pTemp)); } return sbResult.toString(); }
public static String numberToChinese(BigDecimal tempNumber){ return numberToChinese(tempNumber.doubleValue()); } /** * 轉化整數部分 * * @param tempString * @return 返回整數部分 */ private static String getInteger(String tempString){ /** 用來保存整數部分數字串 */ String strInteger = null;// /** 記錄"."所在位置 */ int intDotPos = tempString.indexOf("."); int intSignPos = tempString.indexOf("-"); if(intDotPos == -1){ intDotPos = tempString.length(); } /** 取出整數部分 */ strInteger = tempString.substring(intSignPos + 1, intDotPos); strInteger = new StringBuffer(strInteger).reverse().toString(); StringBuffer sbResult = new StringBuffer(); for(int i = 0; i < strInteger.length(); i++){ sbResult.append(STR_MODIFY[i]); sbResult.append(STR_NUMBER[strInteger.charAt(i) - 48]); } sbResult = sbResult.reverse(); replace(sbResult, "零拾", "零"); replace(sbResult, "零佰", "零"); replace(sbResult, "零仟", "零"); replace(sbResult, "零萬", "萬"); replace(sbResult, "零億", "億"); replace(sbResult, "零零", "零"); replace(sbResult, "零零零", "零"); /** 這兩句不能顛倒順序 */ replace(sbResult, "零零零零萬", ""); replace(sbResult, "零零零零", ""); /** 這樣讀起來更習慣. */ replace(sbResult, "壹拾億", "拾億"); replace(sbResult, "壹拾萬", "拾萬"); /** 刪除個位上的零 */ if(sbResult.charAt(sbResult.length() - 1) == '零' && sbResult.length() != 1){ sbResult.deleteCharAt(sbResult.length() - 1); } if(strInteger.length() == 2){ replace(sbResult, "壹拾", "拾"); } /** *//** 將結果反轉回來. */ return sbResult.toString(); }
/** * 轉化小數部分 例:輸入22.34返回叄肆 * * @param tempString * @return */ private static String getFraction(String tempString){ String strFraction = null; int intDotPos = tempString.indexOf("."); /** *//** 沒有點說明沒有小數,直接返回 */ if(intDotPos == -1){ return ""; } String sbStr=""; strFraction = tempString.substring(intDotPos + 1); if(strFraction.length()==1){ sbStr=STR_NUMBER[strFraction.charAt(0) - 48]+STR_SMALL[1]; } else{ StringBuffer sbResult = new StringBuffer(strFraction.length()); strFraction = new StringBuffer(strFraction).reverse().toString(); for(int i = 0; i < strFraction.length(); i++){ sbResult.append(STR_SMALL[i]); sbResult.append(STR_NUMBER[strFraction.charAt(i) - 48]); } sbResult = sbResult.reverse(); replace(sbResult, "零角零分", ""); replace(sbResult, "零角", "零"); sbStr=sbResult.toString(); if(sbStr.equals("零")){ sbStr=""; } else{ sbStr=sbResult.toString(); } } return sbStr.toString(); }
/** * 判斷傳入的字符串中是否有-若是有則返回負 * * @param tempString * @return */ private static String getSign(String tempString){ return tempString.indexOf("-") != -1 ? "負" : ""; } /** * 替代字符 * * @param pValue * @param pSource * @param pDest */ private static void replace(StringBuffer pValue, String pSource, String pDest){ if(pValue == null || pSource == null || pDest == null) { return; } /** 記錄pSource在pValue中的位置 */ int intPos = 0; do{ intPos = pValue.toString().indexOf(pSource); /** 沒有找到pSource */ if(intPos == -1){ break; } pValue.delete(intPos, intPos + pSource.length()); pValue.insert(intPos, pDest); } while (true); } public static List<String> parseStringToList(String target,String flag){ StringBuilder sb = new StringBuilder(target); int st = 0 ; int ed = sb.indexOf(flag); List<String> list = new LinkedList<String>(); while ( st>=0 && ed>=0) { list.add(sb.substring(st, ed)); st = ed+1; ed = sb.indexOf(flag,st); } if(list.size() > 0){ list.add(sb.substring(st, sb.length())); } return list; } public static String createFilePath(String path){ File file = new File(path); if (!file.exists()) { file.mkdirs(); } return path; } //降序 public static void sortDownArray(String [] arrStr){ String temp; for(int i=0;i<arrStr.length;i++){ for(int j=arrStr.length-1;j>i;j--){ if(arrStr[i].compareTo(arrStr[j])<0){ temp = arrStr[i]; arrStr[i] = arrStr[j]; arrStr[j] = temp; } } } } //升序 public static void sortUpArray(String [] arrStr){ String temp; for(int i=0;i<arrStr.length;i++){ for(int j=arrStr.length-1;j>i;j--){ if(arrStr[i].compareTo(arrStr[j])>0){ temp = arrStr[i]; arrStr[i] = arrStr[j]; arrStr[j] = temp; } } } } public static String[] listSort(List<String> list){ String tmpStr1=""; String tmpStr2=""; double lowD=0; double hightD=0; int length=list.size(); for(int i=0;i<length;i++){ tmpStr1=(String)list.get(i); Double tempStr1D=new Double(tmpStr1); int hcount=0; int lcount=0; int ecount=0; for(int j=0;j<length;j++){ tmpStr2=(String)list.get(j); Double tempStr2D=new Double(tmpStr2); if(tempStr1D>tempStr2D){ hcount++; } if(tempStr1D==tempStr2D){ ecount++; } if(tempStr1D<tempStr2D){ lcount++; } } if(hcount==length-1){ hightD=tempStr1D; } else if(ecount==length-1){ lowD=tempStr1D; hightD=tempStr1D; } else if(lcount==length-1){ lowD=tempStr1D; } } String[] hlAry=new String[2]; hlAry[0]=new Double(lowD).toString(); hlAry[1]=new Double(hightD).toString(); return hlAry; } public static String replaceBlank(String str) { String dest = ""; if (str!=null) { Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(str); dest = m.replaceAll(""); } return dest; } public static boolean isNull(String param){ boolean flag = false; if(param.equals("")||param==null){ param =""; return true; } return flag; } }