【问题标题】:Is there a simple way to apply grammatical casing to a string?有没有一种简单的方法可以将语法大小写应用于字符串?
【发布时间】:2017-02-15 14:35:44
【问题描述】:

我正在UWP 上开发一个Xamarin.Forms 应用程序

我有一个 Editor 控件 - 基本上是一个多行 TextBox

我正在尝试对字符串应用一些简单的语法大小写,基本上如下:

  • 将“I”一词大写
  • 第一个单词大写
  • 句号后的第一个单词大写。

我已经完成了前两个,但在第三个上有点卡住,想知道是否有更简单的方法或者我的算法是否可以调整。

到目前为止我所拥有的是:

    public static string ToGramaticalCase(this string s)
    {
        var thingsToCapitalise = new String[] {"i"};

        string newString = string.Empty;
        if (!string.IsNullOrEmpty(s))
        {
            var wordSplit = s.Split(' ');
            if (wordSplit.Count() > 1)
            {
                var wordToCapitalise = wordSplit.First();
                wordToCapitalise = wordToCapitalise.Substring(0, 1).ToUpper() + wordToCapitalise.Substring(1);
                var value = wordToCapitalise + s.Substring(wordToCapitalise.Length);
                foreach (var item in thingsToCapitalise)
                {
                    value = value.Replace(string.Format(" {0} ", item), string.Format(" {0} ", item.ToUpper()));
                }
                newString = value;
            }

        }
        return newString;
    }

【问题讨论】:

  • 不确定它是否能满足你的所有需求,但你看过Humanizer吗?

标签: c# xamarin uwp xamarin.forms


【解决方案1】:

此方法会将“.”之后的所有单词大写:

        [Test]
        public void Test()
        {
            var result = NewSentenceWithUpperLetter("Sentence one. sentence two.");
            // result will be 'Sentence one. Sentence two.'
        }

        private string NewSentenceWithUpperLetter(string text)
        {
            var splitted = text.Split(' ');
            for (var i = 1; i < splitted.Length; i++)
            {
                if (splitted[i - 1].EndsWith("."))
                {
                    splitted[i] = splitted[i][0].ToString().ToUpper() + splitted[i].Substring(1);
                }
            }

            return string.Join(" ", splitted);
        }

【讨论】:

    【解决方案2】:

    只需在句号上拆分字符串。更改此行:

    var wordSplit = s.Split(' ');
    

    进入这个:

    var wordSplit = s.Split(new char[] { ' ', '.' },StringSplitOptions.RemoveEmptyEntries);
    

    编辑

    这个扩展方法可以做你想做的事:

    public static string ToTitleCase(this string input)
    {
        string output = 
          String.Join(" ", input.Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries)
                        .ToList()
                        .Select(x => x = x.Length>1?
                                     x.First().ToString().ToUpper() + x.Substring(1): 
                                     x.First().ToString().ToUpper()));
        output = 
          String.Join(".", output.Split(new char[] { '.' },StringSplitOptions.RemoveEmptyEntries)
                            .ToList()
                            .Select(x => x = x.Length > 1 ?
                                    x.First().ToString().ToUpper() + x.Substring(1) : 
                                    x.First().ToString().ToUpper()));
        return output;
    }
    

    测试字符串:string input = "i try this test sentence .now it works as i want";

    输出:I Try This Test Sentence .Now It Works As I Want

    【讨论】:

    • wordsplit 目前仅用于获取字符串的第一个单词,是否需要另一个ForEach?你能做一个dotnetfiddle吗?
    • 不,只是改变我告诉你的那一行。它应该可以正常工作(虽然我没有测试过)
    • 等等,现在我看到了问题所在。它不会像它应该的那样加入句子。让我考虑一下
    • 查看我的更新答案。我认为现在可以正常工作
    猜你喜欢
    • 2010-10-03
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多