每日记载内容总结21

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 中对 floatdouble 算法使用的舍入策略。

posted @ 2013-09-08 15:40  CalronLoveRonnie  阅读(479)  评论(1编辑  收藏  举报
AmazingCounters.com