public static void main(String[] args) {
//长度是2说明是英文/数字/英文状态下的字符,长度为4说明是汉字/中文状态下的字符
String str = "测试2s-+¥2#";
for(int i=0; i<str.length(); i++){
System.out.println("[" + str.charAt(i) + "]的长度为:" + Integer.toHexString(str.charAt(i)).length());
}
}

运行结果:

[测]的长度为:4
[试]的长度为:4
[2]的长度为:2
[s]的长度为:2
[-]的长度为:2
[+]的长度为:2
[¥]的长度为:4
[2]的长度为:2
[#]的长度为:2

针对这个原理可以解决页面上有固定宽度的显示区域,但显示区域的内容超长并且有中英文混合,需要进行截断显示(其实也可以采用css处理,但是有些地方css处理会有兼容性的问题)。

特写如下帮助类:

 /*  * Author:   yangzhilong
* Date: 2016年8月25日 下午1:44:36
* Description: //模块目的、功能描述
* History: //修改记录
* <author> <time> <version> <desc>
* 修改人姓名 修改时间 版本号 描述
*/
import org.apache.commons.lang3.StringUtils; /**
* 〈一句话功能简述〉<br>
* 〈功能详细描述〉
*
* @author yangzhilong
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class StringSubstringUtils { private static enum MODEL{UP, DOWN}; /**
* 功能描述: <br>
* 〈功能详细描述〉
*
* @param args
* @throws Exception
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static void main(String[] args) throws Exception {
String str = "测试哈2哈ek";
//4个汉字的宽度
System.out.println(substrByByteLength(str, 16, MODEL.DOWN));
//4个汉字的宽度
System.out.println(substrByByteLength(str, 16, MODEL.UP)); //4个汉字加一个英文的宽度
System.out.println(substrByByteLength(str, 18, MODEL.DOWN));
//4个汉字加一个英文的宽度
System.out.println(substrByByteLength(str, 18, MODEL.UP)); //5个汉字的宽度
System.out.println(substrByByteLength(str, 20, MODEL.DOWN));
//5个汉字的宽度
System.out.println(substrByByteLength(str, 20, MODEL.UP));
} /**
*
* 功能描述: <br>
* 截图字符串的指定字节长度
*
* @param str
* @param length 字节长度,必须为2的整数倍
* @param model 截取模式,例如截图的地方是一个汉字(4个长度),是保留这个汉字还是不要,UP为保留,DOWN为不保留
* @return
* @throws Exception
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static String substrByByteLength(String str, int length, MODEL model) throws Exception{
if(StringUtils.isBlank(str)){
return str;
}
if(length <=0){
throw new RuntimeException("length必须大于0");
}
if(length%2 != 0){
throw new RuntimeException("length必须是2的整数倍");
}
int tempLengthCount = 0;
for(int i=0,len=str.length(); i<len; i++){
tempLengthCount += Integer.toHexString(str.charAt(i)).length();
if(tempLengthCount>=length){
if(tempLengthCount > length){
switch (model) {
case UP:
if(i < (len-1)){
return str.substring(0, i+1) + "..";
}else{
return str.substring(0, i+1);
}
case DOWN:
if(i <= (len-1))
return str.substring(0, i) + "..";
else
return str.substring(0, i);
}
}else{
if(i < (len-1)){
return str.substring(0, i+1) + "..";
}else{
return str.substring(0, i+1);
}
}
}
}
return str;
}
}

运行结果如下:

测试哈2..
测试哈2哈..
测试哈2哈..
测试哈2哈..
测试哈2哈e..
测试哈2哈e..

JAVA识别字符串是数字(英文)还是汉字,web页面进行字符截断的帮助类的更多相关文章

  1. EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字

    EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字 Function 求数字和字母(对象 As String) '在文本与数字混杂中提取数字和字母   Dim myReg    ...

  2. 在SQL中取出字符串中数字部分或在SQL中取出字符部分

    在SQL中取出字符串中数字部分或在SQL中取出字符部分 编写人:CC阿爸 2013-10-18 近来在开发一个项目时,一包含数字的字符串,需要取出中间的数字部分进行排序.经过baidu搜索.并结合自己 ...

  3. js判断字符串中的英文和汉字

    有时需要判断一个字符是不是汉字,比如在用户输入含有中英文的内容时,需要判断是否超过规定长度就要用到.用 Javascript 判断通常有两种方法. 方法一 正则表达式,test()方法返回true 或 ...

  4. java中字符串与数字的互相转换

    import java.text.DecimalFormat; /* * String类中本身提供方法可以将几乎所有的基本类型转换为String类型 * sysout alt+/ 可以直接显示Syst ...

  5. Java "double字符串转数字"

    1.int 表示数字的简单类型(值类型),double 表示数字的双精度类型(值类型),  而Integer和Double类型是一个引用的复杂类型 2.Integer.valueOf(String s ...

  6. java使字符串的数字加一

    /** * 字符串+1方法,该方法将其结尾的整数+1,适用于任何以整数结尾的字符串,不限格式,不限分隔符. * @author zxcvbnmzb * @param testStr 要+1的字符串 * ...

  7. (转)在SQL中取出字符串中数字部分或在SQL中取出字符部分

    近来在开发一个项目时,一包含数字的字符串,需要取出中间的数字部分进行排序.经过baidu搜索.并结合自己项目的需求,编写了一个自定义的SQL函数用供项目中使用. /****** Object: Use ...

  8. js的字符串是数字时过长的时候会被截断

    JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围:对于超过这个范围的整数, ...

  9. c/c++再学习:常用字符串转数字操作

    c/c++再学习:常用字符串转数字操作 能实现字符串转数字有三种方法,atof函数,sscanf函数和stringstream类. 具体demo代码和运行结果 #include "stdio ...

随机推荐

  1. C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher (WMI)

    实现方法参考 http://www.cnblogs.com/chengulv/archive/2012/12/29/2839303.html 下面介绍查看属性的方法: (1)在运行里输入 “WBEMT ...

  2. poj 1325 Machine Schedule 题解

    Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14479   Accepted: 6172 ...

  3. Linux命令之du

    Linux du命令用来查看文件或目录所占用磁盘空间的大小(Summarize disk usage of each FILE, recursively for directories.) 语法: d ...

  4. Sql Server简单加密与解密 【转】

    前言: 在SQL Server 2005和SQL Server 2008之前.如果希望加密敏感数据,如财务信息.工资或身份证号,必须借助外部应用程序或算法.SQL Server 2005引入内建数据加 ...

  5. lazarus汉化

    启动Lazarus IDE,点击菜单栏中的Environment,再点击Options选项 在弹出的IDE选项框内,点选左侧Environment下的Desktop子选项,将Language设为Chi ...

  6. 杨晓峰-Java核心技术-6 动态代理 反射 MD

    目录 第6讲 | 动态代理是基于什么原理? 典型回答 考点分析 知识扩展 反射机制及其演进 动态代理 精选留言 Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAnd ...

  7. C# MemCached分布式缓存

    using System; using System.Collections.Generic; using System.Text; using Memcached.ClientLibrary; us ...

  8. 使用checkstyle来规范你的项目

    Checkstyle是什么 自从做了程序员,关于格式化的讨论就不曾中断过,到底什么才是正确的,什么才是错误的,到现在也没有完整的定论.但随着时间发展,渐渐衍生出一套规范出来.没有什么绝对的正确和错误, ...

  9. jdbc操作数据库并自动获取字段类型

    //获取改功能编码的关联功能 public void getLinkdb(String gnbianma){ PreparedStatement pstmt = null; ResultSet rs ...

  10. 用迁移学习创造的通用语言模型ULMFiT,达到了文本分类的最佳水平

    https://www.jqr.com/article/000225 这篇文章的目的是帮助新手和外行人更好地了解我们新论文,我们的论文展示了如何用更少的数据自动将文本分类,同时精确度还比原来的方法高. ...