• 每日记载内容总结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 算法使用的舍入策略。

  • 相关阅读:
    Google ObjectiveC Style Guide
    FlvDownloader 2.2发布
    在C#中实现关机
    在.net 2.0/3.0程序中使用扩展方法
    Boost智能指针——scoped_ptr
    二叉查找树
    用C#调用ffmpeg实现媒体类型转换(1)
    FlvDownloader v2.21发布
    发布一款ICO图标和PNG批量转换工具
    在.net中创建外接程序
  • 原文地址:https://www.cnblogs.com/cuiyf/p/3308398.html
Copyright © 2020-2023  润新知