1.对于一段String字符串,替换某些特殊字符,给每个中文后面加空格,构成新的字符串
public static String remSpeChar(String name){ String resultName = ""; if (name != null && !"".equals(name.trim())) { for (int i = 0; i < name.length(); i++) { int str = name.charAt(i); if (str==40 || str==41 || str==45 || str==46 || str==47 || str==58 || str==91 || str==93 || str==94 || str==123 || str==125 ) { resultName += " "; //给特殊字符替换为空格 }else if (str >= 19986 && str <= 171941 ) { resultName += String.valueOf((char)str)+" ";//中文后面加空格 }else { resultName += String.valueOf((char)str); } } } return resultName; }
注意:char可以自动转化为int int str = string.charAt(i); int需要强转才能转化为char char name =(char)str
另外下面方法也可以判断字符串中是否含有中文:
public static final boolean isChineseCharacter(String chineseStr) { char[] charArray = chineseStr.toCharArray(); for (int i = 0; i < charArray.length; i++) { if ((charArray[i] >= 0x4e00) && (charArray[i] <= 0x9fbb)) { return true; } } return false; }
2. Unrecognized Windows Sockets error: 0: JVM_Bind 端口占用
3.<s:token />标签防止表单重复提交:
(1)在表单中加入<s:token /> (可放入form中的任意位置)
<s:form action="hello" method="post" namespace="/hello"> <s:textfield name="person.name /><s:token /><s:submit /> </s:form>
(2)在struts.xml文件中为action配置拦截器 <action name="hello" class="com.test.HelloWord" method="{1}"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="token" /> <result name="invalid.token">/WEB-INF/page/message.jsp</result> <result>/WEB-INF/page/result.jsp</result> </action> 以上配置加入了“token”拦截器和“invalid.token”结果,因为“token” 拦截器在会话的token与请求的token不一致时, 将会直接返回“invalid.token”结果
或者(2) 在struts.xml文件中为为包配置拦截器 <package name="TestStruts" extends="struts-default"> <interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="token"/> <interceptor-ref name="token-session"/> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack" /> <action name="Login" class="com.unmi.struts2.action.LoginAction"> <result name="input">/login.jsp</result> <result name="invalid.token">/exception.jsp</result> </action> </package>
4.java实现将一个图片按原比例放大或者缩小到一个定长定宽的框内,以下类用来计算放入框内的原图片的长宽
package test; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class Testbli { public static BigDecimal resultWidth ; public static BigDecimal resultHeight ; public static void getbili(BigDecimal width ,BigDecimal height , BigDecimal targetWidth ,BigDecimal targetHeight){ MathContext mc = new MathContext(5, RoundingMode.HALF_UP);//四舍五入 保留5位小数 BigDecimal scale1 = width.divide(height,mc); BigDecimal scale2 = targetWidth.divide(targetHeight,mc) ; if (scale1.compareTo(scale2) == 1) { resultWidth = targetWidth ; resultHeight = targetWidth.multiply(height).divide(width,mc); }else { resultHeight = targetHeight ; resultWidth = targetHeight.multiply(width).divide(height,mc) ; } BigDecimal result1 = resultWidth.divide(resultHeight,mc); System.out.println(resultWidth +"---"+ resultHeight); System.out.println(result1+"---"+scale1); } public static void main(String[] args) { getbili( new BigDecimal(633), new BigDecimal(983), new BigDecimal(200), new BigDecimal(400)); } }
扩展:java精确计算除法,可保留任意长的有效数字
public static void main(String[] args) { // 除数 BigDecimal bd = new BigDecimal(153); // 被除数 BigDecimal bd2 = new BigDecimal(7); // 进行除法运算,保留200位小数,末位使用四舍五入方式,返回结果 BigDecimal result = bd.divide(bd2, 200, BigDecimal.ROUND_HALF_UP); System.out.println("完整200位小数结果: " + result); System.out.println("float : " + result.floatValue()); System.out.println("double : " + result.doubleValue()); // 指定想要的小数位长度取值 NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(20);// 最大小数位 nf.setMinimumFractionDigits(5); // 最小小数位 String str = nf.format(result); System.out.println("指定位数取值: " + str); }
再扩展:
有时出现异常:
Non-terminating decimal expansion; no exact representable decimal result
原因:BigDecimal result = bd.divide(bd2); bd除以bd2的时候,结果出现无限循环,比如1/3 结果就是0.33333333333…………程序出错
解决方法:devide的函数定义如下
BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;
scale为小数位数;
roundingMode为小数模式;
设置小数位数以及小数模式即可,如BigDecimal result = bd.divide(bd2,5, RoundingMode.HALF_UP) 5位小数,四舍五入
再再扩展:关于舍入方式HALF_EVEN:
HALF_EVEN
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略。