Opracowuję aplikację Xamarin.Forms na UWP

Mam sterowanie Editor - w zasadzie wielofunkcyjna TextBox

Próbuję zastosować prostą obudowę gramatyczną do łańcucha w zasadzie następujące:

  • Kapitalizuj słowo "i"
  • Kapitalizuj pierwsze słowo
  • Kapitalizuj pierwsze słowo po pełnym przystanku.

Udało mi się zrobić pierwsze dwa i jestem trochę utknął na trzecim i zastanawiałem się, czy jest łatwiejszy sposób lub czy mój algorytm można dostosować.

Do tej pory mam:

    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;
    }
0
User1 15 luty 2017, 17:35

2 odpowiedzi

Najlepsza odpowiedź

Ta metoda wykorzystuje wszystkie słowa po ".":

        [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);
        }
1
Michał Żołnieruk 15 luty 2017, 14:46

Wystarczy podzielić ciąg również na pełnym przystanku. Zmień tę linię:

var wordSplit = s.Split(' ');

Zaangażowany w to:

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

Edytuj

Ta metoda rozszerzenia zrobiłaby to, co chcesz:

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;
}

Ciąg testowy: string input = "i try this test sentence .now it works as i want";

Wyjście: I Try This Test Sentence .Now It Works As I Want

1
Pikoh 15 luty 2017, 15:04