374、编写一个截取字符串的函数,输入为一个字符串和字符数,输出为按字符截取的字符串。 
但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

解决方案 »

  1.   

    public static String subStriing(String str, int i) {
    String returnStr = "";
    int k = 0;
    for (int j = 0; j < i; j++) {
    char c = str.charAt(j);
    if (c < 256) {
    k++;
    if (k <= i) {
    returnStr += c;
    }
    } else {
    k += 2;
    if (k <= i) {
    returnStr += c;
    }
    }
    }
    return returnStr;
    }
      

  2.   

    代码如下: public String substr(String str, int length){
    try {
    byte[] bs = str.getBytes("GBK");
    String result = new String(bs, 0, length, "GBK");
    char last = result.charAt(result.length()-1);
    if (last==0xFFFD) result = result.substring(0, result.length()-1);
    System.out.println(result);
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    }
    顺便问一下,374是题号?
      

  3.   

    2楼有语法错,订正如下: public static String substr(String str, int length) {
    try {
    byte[] bs = str.getBytes("GBK");
    if (length>=bs.length) return str;
    String result = new String(bs, 0, length, "GBK");
    char last = result.charAt(result.length() - 1);
    if (last == 0xFFFD)
    result = result.substring(0, result.length() - 1);
    return result;
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    return null;
    }
      

  4.   

    帮1楼修订一个Bug:
    for (int j = 0; j < i; j++) {
    应该改成
    for (int j = 0; j < i && j < str.length(); j++) {
    否则可能会有越界错。
      

  5.   

    public static String subString(String str, int count) {
    // TODO Auto-generated method stub
    StringBuilder sb = new StringBuilder();
    int codePoint = 0;

    for(int i=0; i<count; i++) {
    codePoint = str.codePointAt(i);
    String s = Array.get(Character.toChars(codePoint),0).toString();
    sb.append(s);

    }
    return sb.toString();
    }测试可以使用
      

  6.   

    有人问过类似的问题
    http://topic.csdn.net/u/20110821/08/bed95274-215e-44d8-949e-8617c27a5925.htmlpublic String leftByteString(String src, int len) {
        StringBuilder buf = new StringBuilder();
        int count = 0;
        for (char c : s.toCharArray()) {
            count += (c>=0x4e00 && c<=0x9fa5) ? 2 : 1;
            if (count > len) {
                return buf.toString();
            }
            buf.append(c);
        }
        return buf.toString();
    }
      

  7.   

    可以考虑加上编码参数试试
    public class Test {
        public static void main(String[] args) throws Throwable {
            System.out.println(byteString("我ABC汉DEF", 6, "UTF-8"));
            System.out.println(byteString("我ABC汉DEF", 6, "UTF-16"));
        }    public static String byteString(String src, int length, String charset) throws Exception {
            int len = (length > src.length()) ? src.length() : length;
            for (int i=len; i>=0; i--) {
               if (src.substring(0, i).getBytes(charset).length <= length) {
                   return src.substring(0, i);
               }
            }
            return src;
        }
    }
      

  8.   

    public class CharJieQu {

     public static String bSubstring(String s, int length) throws Exception
        {            int n=0;
                int i=0;
                int k=0;
                byte b[]=s.getBytes();
               
                for(;i<b.length && k<length;i++){
                
                 if(b[i]<0){
                 n=n+1;
                 }
                 k++;
                
                } 
              
                if(n%2!=0){
                 if(b[i-1]<0 && b[i]<0){
                 i=i-1;
                 }else if(b[i-1]>0 && b[i]<0){
                 i=i-1;
                 }
                }            return new String(b,0,i);
        }
    public static void main(String[] args) {
     try {
    System.out.println(new CharJieQu().bSubstring("我abc汉def字gh",2));
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }

    }汉字占两个字节并且字节都是大于零的,英文字符占一个字节并且字节是小于零的。这个是解决本题目的关键所在。以上是代码,本人亲测过了。如有不明之处 加群:107187002  大家一起交流一下
      

  9.   

     substring 
      public String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 
      例如: 
      "unhappy".substring(2) returns "happy" 
      "Harbison".substring(3) returns "bison" 
      "emptiness".substring(9) returns "" (an empty string) 
      参数: 
      beginIndex - 开始处的索引(包括)。 
      返回: 
      指定的子字符串。 
      抛出: 
      IndexOutOfBoundsException - 如果 beginIndex 为负或大于此 String 对象的长度。 
      -------------------------------------------------------------------------------- 
      substring 
      public String substring(int beginIndex, 
      int length)返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,一直到 length-1 位置处的字符串。 
      示例: 
      "hamburger".substring(4,8) returns "urge" 
      "smiles".substring(1,5) returns "mile" 
      参数: 
      beginIndex - 开始处的索引(包括)。 
      返回: 
      指定的子字符串。 
      抛出: 
      IndexOutOfBoundsException - 如果 beginIndex 为负,或length大于字符串长度。 
      -----------------------------------------------------以下为rongew更新-------------------------------------------- 
      C#中 substring() 有两个重载函数 
      substring(int a) 用法同上 
      substring(int a,int b) b参数应该为截取后的字符串长度 
      上面string得用法不只是针对哪种语法 
      针对的是c# 
      -------------------------------------------------------- 
      在VB中,如上的substring用法是正确的 
      -----------------------------------------------------以下为crazyghost_von更新-------------------------------------------- 
      以上函数的用法在JavaScript中也是正确的。 
      ----------------------------------------------------------------------------------------------------------------------------------- 
      下面是在javascript中的用法. 
      在JS中, 函数声明: stringObject.substring(start,stop) 
      start是在原字符串检索的开始位置,stop是检索的终止位置,返回结果中不包括stop所指字符. 
    编辑本段
    示例
      <script type="text/javascript"> 
      var str="Hello world!" 
      document.write(str.substring(1,3)); 
      </script> 
      上面返回字符串:"el"; 
      str.substring(1,1) //返回空; 
      str.substring(1) //返回"ello world"; 
      还有此函数中会出现奇怪的现象,当出现str.substring(5,0); 
      这又是怎么回事,不过返回的是"hello", 
      str.substring(5,1) //返回"ello",截去了第一位,返回余下的. 
      可见substring(start,end),可以有不同的说明,即start可以是要返回的长度,end是所要去掉的多少个字符(从首位开始). 
      在JS中,substr(start,length),用得较方便.