如何解决:字符串中每个单词的大写首字母-一个字母单词除外

时间:2019-02-02 17:04:21

标签: c# string

除了一个字母的单词,我都有一个代码将每个单词的首字母大写。我的问题是,如果该字符串的最后一个单词是一个字母,它将给出索引超出范围的异常。这是有道理的,因为最后一个字母不存在代码array[i + 1]

static string UppercaseWords(string value)
        {
            char[] array = value.ToLower().ToCharArray();
            // Handle the first letter in the string.

            array[0] = char.ToUpper(array[0]);
            // Scan through the letters, checking for spaces.
            // ... Uppercase the lowercase letters following spaces.
            for (int i = 1; i < array.Length; i++)
            {
                if (array[i - 1] == ' ' && array[i + 1] != ' ') 
                {
                    array[i] = char.ToUpper(array[i]);
                }
            }
            return new string(array);
        }

我只是在寻找解决该异常的方法,或者通过另一种方法来解决此问题。谢谢。

3 个答案:

答案 0 :(得分:1)

您可以改善病情,因此您不会要求第(i + 1)个索引。

if (array[i - 1] == ' ' && i + 1 < array.Length && array[i + 1] != ' ') 

答案 1 :(得分:1)

您可以提取所有单词(用空格分隔的字符串部分),并在部分长度为> 1时将字符串部分的第一个字母转换为大写:

string input = "this is a sample, string with: some => 1 letter words ! a";

StringBuilder sb = new StringBuilder(input.Length * 2);
foreach (string word in input.Split())
{
    if (word.Length > 1) {
        sb.Append(char.ToUpper(word[0]));
        sb.Append(word.Substring(1));
    }
    else {
        sb.Append(word);
    }
    sb.Append((char)32);
}
Console.WriteLine(sb);

打印:

This Is a Sample, String With: Some => 1 Letter Words ! a

答案 2 :(得分:0)

建议:

我将为您的字符串处理做一个扩展类:

public static class StringExtensions
{
    public static string AllWordsInStringToUpperCase(this string value)
    {
        return string.Join(' ', value.Split(' ').Select(s => s.FirstCharToUpperCase()));
    }

    public static string FirstCharToUpperCase(this string word)
    {
        if (word.Length == 1)
            return word;

        return word.First().ToString().ToUpper() + word.Substring(1);
    }
}

在控制台应用程序中,例如,像下面这样使用它:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("fuu a bar".AllWordsInStringToUpperCase());
    }
}

输出:Fuu a Bar

通过编写一些测试,您可以知道自己想要的行为。

和平!