将名称的第一个字符转换为大写的函数

时间:2014-01-15 12:53:12

标签: java

背景我有一个将名称的第一个字符转换为大写的函数:

public static String toTitleCase(String givenString) {
        String[] arr = givenString.split(" ");
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < arr.length; i++) {
            sb.append(Character.toUpperCase(arr[i].charAt(0))).append(arr[i].substring(1)).append(" ");
        }          
        return sb.toString().trim();
    }  

我的数据来源多种多样,青少年倾向于在Facebook上显示其显示名称中的特殊字符,即使用标准英语以外的某种语言遇到名称,当通过上述功能处理此类名称时,我的代码会中断,这种情况可以替代吗?

示例名称:

Юлия Кривко
Петр Лаптиев
Михаил Дворкович

给我一​​个关于这些名字的索引超出范围的例外。我想知道我的功能是否正常工作或者是字符类型的问题。

修改 似乎问题伴随着空格的数量,将名字和姓氏分开:

01-15 18:32:54.326: I/System.out(5346): Aleksandr  Polyakov
01-15 18:32:54.359: I/System.out(5346): java.lang.StringIndexOutOfBoundsException: length=0; index=0
01-15 18:32:54.359: I/System.out(5346): Aleksandr
01-15 18:32:54.645: I/System.out(5346): Bakhytzhan  Torekeyev
01-15 18:32:54.675: I/System.out(5346): java.lang.StringIndexOutOfBoundsException: length=0; index=0
01-15 18:32:54.675: I/System.out(5346): Bakhytzhan
01-15 18:32:54.925: I/System.out(5346): Pashtet  OGames
01-15 18:32:54.975: I/System.out(5346): java.lang.StringIndexOutOfBoundsException: length=0; index=0

2 个答案:

答案 0 :(得分:4)

当名称与多于一个空格字符分隔时,将发生索引超出范围异常。在这种情况下,在创建拆分的其他空元素之后,在charAt(0)处没有任何内容。 要避免此问题,请使用正则表达式匹配多个空格。例如。 split("[ ]+")

答案 1 :(得分:1)

关于您的代码的一些其他注意事项:

1:您将名称的第一个字符设为大写。是否要将名称中的剩余字符强制为小写?示例:约翰史密斯将成为约翰史密斯。

2:我不了解其他语言,但是,在英语中,以下名称有多个字符大写(由于单引号):John O'Brian。

3:一些英文姓氏带有连字符,因此需要多个单词大写。示例:John Jones-Smith。

4:结合第2项和第3项的例子:John O'Brian-Smith。

5:在处理数据之前,您可能需要考虑修剪名称中的任何前导和尾随空格。另外,如果它只包含一个空字符串(在这种情况下,返回一个空字符串),请不要处理名称(不要调用split函数)。

即使您使用英语以外的语言处理名称,您也应该考虑上述语言的特殊条件。