Java StringUtil
关于字符串的一些常用工具方法:
package com.javachen.util.string;
import java.util.regex.Pattern;
/**
*
* @author javachen
* @date 2010.1.26
*/
public class StringUtil {
public static String escape(String src) {
int i;
char j;
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length() * 6);
for (i = 0; i < src.length(); i++) {
j = src.charAt(i);
if (Character.isDigit(j) || Character.isLowerCase(j)
|| Character.isUpperCase(j))
tmp.append(j);
else if (j < 256) {
tmp.append("%");
if (j < 16)
tmp.append("0");
tmp.append(Integer.toString(j, 16));
} else {
tmp.append("%u");
tmp.append(Integer.toString(j, 16));
}
}
return tmp.toString();
}
public static String unescape(String src) {
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos = 0, pos = 0;
char ch;
while (lastPos < src.length()) {
pos = src.indexOf("%", lastPos);
if (pos == lastPos) {
if (src.charAt(pos + 1) == 'u') {
ch = (char) Integer.parseInt(src
.substring(pos + 2, pos + 6), 16);
tmp.append(ch);
lastPos = pos + 6;
} else {
ch = (char) Integer.parseInt(src
.substring(pos + 1, pos + 3), 16);
tmp.append(ch);
lastPos = pos + 3;
}
} else {
if (pos == -1) {
tmp.append(src.substring(lastPos));
lastPos = src.length();
} else {
tmp.append(src.substring(lastPos, pos));
lastPos = pos;
}
}
}
return tmp.toString();
}
/**
* 将字符串 source 中的 oldStr 替换为 newStr, 并以大小写敏感方式进行查找
*
* @param source
* 需要替换的源字符串
* @param oldStr
* 需要被替换的老字符串
* @param newStr
* 替换为的新字符串
*/
public static String replace(String source, String oldStr, String newStr) {
return replace(source, oldStr, newStr, true);
}
/**
* 将字符串 source 中的 oldStr 替换为 newStr, matchCase 为是否设置大小写敏感查找
*
* @param source
* 需要替换的源字符串
* @param oldStr
* 需要被替换的老字符串
* @param newStr
* 替换为的新字符串
* @param matchCase
* 是否需要按照大小写敏感方式查找
*/
public static String replace(String source, String oldStr, String newStr,
boolean matchCase) {
if (source == null) {
return null;
}
// 首先检查旧字符串是否存在, 不存在就不进行替换
if (source.toLowerCase().indexOf(oldStr.toLowerCase()) == -1) {
return source;
}
int findStartPos = 0;
int a = 0;
while (a > -1) {
int b = 0;
String str1, str2, str3, str4, strA, strB;
str1 = source;
str2 = str1.toLowerCase();
str3 = oldStr;
str4 = str3.toLowerCase();
if (matchCase) {
strA = str1;
strB = str3;
} else {
strA = str2;
strB = str4;
}
a = strA.indexOf(strB, findStartPos);
if (a > -1) {
b = oldStr.length();
findStartPos = a + b;
StringBuffer bbuf = new StringBuffer(source);
source = bbuf.replace(a, a + b, newStr) + "";
// 新的查找开始点位于替换后的字符串的结尾
findStartPos = findStartPos + newStr.length() - b;
}
}
return source;
}
/**
* 清除字符串结尾的空格.
*
* @param input
* String 输入的字符串
* @return 转换结果
*/
public static String trimTailSpaces(String input) {
if (isEmpty(input)) {
return "";
}
String trimedString = input.trim();
if (trimedString.length() == input.length()) {
return input;
}
return input.substring(0, input.indexOf(trimedString)
+ trimedString.length());
}
/**
* Change the null string value to "", if not null, then return it self, use
* this to avoid display a null string to "null".
*
* @param input
* the string to clear
* @return the result
*/
public static String clearNull(String input) {
return isEmpty(input) ? "" : input;
}
/**
* Return the limited length string of the input string (added at:April 10,
* 2004).
*
* @param input
* String
* @param maxLength
* int
* @return String processed result
*/
public static String limitStringLength(String input, int maxLength) {
if (isEmpty(input))
return "";
if (input.length() < = maxLength) {
return input;
} else {
return input.substring(0, maxLength - 3) + "...";
}
}
/**
* 判断字符串是否全是数字字符.
*
* @param input
* 输入的字符串
* @return 判断结果, true 为全数字, false 为还有非数字字符
*/
public static boolean isNumeric(String input) {
if (isEmpty(input)) {
return false;
}
for (int i = 0; i < input.length(); i++) {
char charAt = input.charAt(i);
if (!Character.isDigit(charAt)) {
return false;
}
}
return true;
}
/**
* 转换由表单读取的数据的内码(从 ISO8859 转换到 gb2312).
*
* @param input
* 输入的字符串
* @return 转换结果, 如果有错误发生, 则返回原来的值
*/
public static String ISO2GBK(String input) {
try {
byte[] bytes = input.getBytes("ISO8859-1");
return new String(bytes, "GBK");
} catch (Exception ex) {
}
return input;
}
/**
* 转换由表单读取的数据的内码到 ISO(从 GBK 转换到ISO8859-1).
*
* @param input
* 输入的字符串
* @return 转换结果, 如果有错误发生, 则返回原来的值
*/
public static String GBK2ISO(String input) {
return changeEncoding(input, "GBK", "ISO8859-1");
}
/**
* 转换字符串的内码.
*
* @param input
* 输入的字符串
* @param sourceEncoding
* 源字符集名称
* @param targetEncoding
* 目标字符集名称
* @return 转换结果, 如果有错误发生, 则返回原来的值
*/
public static String changeEncoding(String input, String sourceEncoding,
String targetEncoding) {
if (input == null || input.equals("")) {
return input;
}
try {
byte[] bytes = input.getBytes(sourceEncoding);
return new String(bytes, targetEncoding);
} catch (Exception ex) {
}
return input;
}
/**
* 将单个的 ' 换成 ''; SQL 规则:如果单引号中的字符串包含一个嵌入的引号,可以使用两个单引号表示嵌入的单引号.
*/
public static String replaceSql(String input) {
return replace(input, "'", "''");
}
/**
* 对给定字符进行 URL 编码
*/
public static String encode(String value) {
if (isEmpty(value)) {
return "";
}
try {
value = java.net.URLEncoder.encode(value, "GB2312");
} catch (Exception ex) {
ex.printStackTrace();
}
return value;
}
/**
* 对给定字符进行 URL 解码
*
* @param value
* 解码前的字符串
* @return 解码后的字符串
*/
public static String decode(String value) {
if (isEmpty(value)) {
return "";
}
try {
return java.net.URLDecoder.decode(value, "GB2312");
} catch (Exception ex) {
ex.printStackTrace();
}
return value;
}
/**
* 判断字符串是否未空, 如果为 null 或者长度为0, 均返回 true.
*/
public static boolean isEmpty(String input) {
return (input == null || input.length() == 0);
}
/**
* 获得输入字符串的字节长度(即二进制字节数), 用于发送短信时判断是否超出长度.
*
* @param input
* 输入字符串
* @return 字符串的字节长度(不是 Unicode 长度)
*/
public static int getBytesLength(String input) {
if (input == null) {
return 0;
}
int bytesLength = input.getBytes().length;
return bytesLength;
}
/**
* 检验字符串是否未空, 如果是, 则返回给定的出错信息.
*
* @param input
* 输入的字符串
* @param errorMsg
* 出错信息
* @return 空串返回出错信息
*/
public static String isEmpty(String input, String errorMsg) {
if (isEmpty(input)) {
return errorMsg;
}
return "";
}
/**
* 判断是否为质数
*
* @param x
* @return
*/
public static boolean isPrime(int x) {
if (x <= 7) {
if (x == 2 || x == 3 || x == 5 || x == 7)
return true;
}
int c = 7;
if (x % 2 == 0)
return false;
if (x % 3 == 0)
return false;
if (x % 5 == 0)
return false;
int end = (int) Math.sqrt(x);
while (c <= end) {
if (x % c == 0) {
return false;
}
c += 4;
if (x % c == 0) {
return false;
}
c += 2;
if (x % c == 0) {
return false;
}
c += 4;
if (x % c == 0) {
return false;
}
c += 2;
if (x % c == 0) {
return false;
}
c += 4;
if (x % c == 0) {
return false;
}
c += 6;
if (x % c == 0) {
return false;
}
c += 2;
if (x % c == 0) {
return false;
}
c += 6;
}
return true;
}
/**
* 返回指定字节长度的字符串
*
* @param str
* String 字符串
* @param length
* int 指定长度
* @return String 返回的字符串
*/
public static String toLength(String str, int length) {
if (str == null) {
return null;
}
if (length <= 0) {
return "";
}
try {
if (str.getBytes("GBK").length <= length) {
return str;
}
} catch (Exception ex) {
}
StringBuffer buff = new StringBuffer();
int index = 0;
char c;
length -= 3;
while (length > 0) {
c = str.charAt(index);
if (c < 128) {
length--;
} else {
length--;
length--;
}
buff.append(c);
index++;
}
buff.append("...");
return buff.toString();
}
/**
* 判断是否为整数
*
* @param str
* 传入的字符串
* @return 是整数返回true,否则返回false
*/
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
/**
* 判断是否为浮点数,包括double和float
*
* @param str
* 传入的字符串
* @return 是浮点数返回true,否则返回false
*/
public static boolean isDouble(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");
return pattern.matcher(str).matches();
}
/**
* 判断输入的字符串是否符合Email样式.
*
* @param str
* 传入的字符串
* @return 是Email样式返回true,否则返回false
*/
public static boolean isEmail(String str) {
Pattern pattern = Pattern
.compile("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
return pattern.matcher(str).matches();
}
/**
* 判断输入的字符串是否为纯汉字
*
* @param str
* 传入的字符窜
* @return 如果是纯汉字返回true,否则返回false
*/
public static boolean isChinese(String str) {
Pattern pattern = Pattern.compile("[\u0391-\uFFE5]+$");
return pattern.matcher(str).matches();
}
}
Big5字与Unicode的互换:
public static String big5ToUnicode(String s){
try{
return new String(s.getBytes("ISO8859_1"), "Big5");
}
catch (UnsupportedEncodingException uee){
return s;
}
}
public static String UnicodeTobig5(String s){
try{
return new String(s.getBytes("Big5"), "ISO8859_1");
}
catch (UnsupportedEncodingException uee){
return s;
}
}
public static String toHexString(String s){
String str="";
for (int i=0; i
转译特殊符号标签:
public static String filter(String value)
{
if(value == null || value.length() == 0)
return value;
StringBuffer result = null;
String filtered = null;
for(int i = 0; i < value.length(); i++)
{
filtered = null;
switch(value.charAt(i))
{
case 60: // '<'
filtered = "<";
break;
case 62: // '>'
filtered = ">";
break;
case 38: // '&'
filtered = "&";
break;
case 34: // '"'
filtered = """;
break;
case 39: // '\''
filtered = "'";
break;
}
if(result == null)
{
if(filtered != null)
{
result = new StringBuffer(value.length() + 50);
if(i > 0)
result.append(value.substring(0, i));
result.append(filtered);
}
} else
if(filtered == null)
result.append(value.charAt(i));
else
result.append(filtered);
}
return result != null ? result.toString() : value;
}
判断字符是否属于中文 :
// GENERAL_PUNCTUATION 判断中文的“号
// CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号
// HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的,号
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 void isChinese(String strName) {
char[] ch = strName.toCharArray();
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if(isChinese(c)==true){
System.out.println(isChinese(c));
return;
}else{
System.out.println(isChinese(c));
return ;
}
}
}
人民币转成大写 :
/**
* 人民币转成大写
*
* @param value
* @return String
*/
public static String hangeToBig(double value)
{
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; // 返回正确表示
}
好东西,Star
其实这么长你可以做.java下载。。。
而且你可以在package加入自己的com.javachen.util.*
不想打包传到自己服务器,麻烦
包名是起的简单名字,代码多了,复杂的包名改起来麻烦。。
呵呵,说的都是麻烦,其实我也并不怕麻烦,只是现在怎样方便怎样做
你说的是个好建议,呵呵,我去改改,改成我的网站的包名
或许,我该好好用google的代码托管工具,呵呵
复习GR的Share,过来看看
你的网站是不是没有启用邮件Comment回复啊,我印象里没收到你上面这条回复
没有过多的去关注插件,我去检查一下是否启用了