Czy istnieje łatwy sposób na zapisanie pierwszej litery ciągu wielką literą i zmniejszenie pozostałej części? Czy istnieje metoda wbudowana, czy też muszę stworzyć własną?
c#
string
capitalize
Mike Roosa
źródło
źródło
Odpowiedzi:
TextInfo.ToTitleCase()
zamienia na wielką literę pierwszy znak w każdym tokenie ciągu.Jeśli nie ma potrzeby zachowywania dużych liter akronimów, należy dołączyć
ToLower()
.Jeśli CurrentCulture jest niedostępna, użyj:
Aby uzyskać szczegółowy opis, zobacz łącze MSDN .
źródło
źródło
sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
, jak możemy być pewni, że nie ma kultury, która traktuje to inaczej?Powyższy kod nie zadziała .....
więc umieść poniższy kod, konwertując na niższy, a następnie zastosuj funkcję
źródło
Istnieją przypadki, które
CultureInfo.CurrentCulture.TextInfo.ToTitleCase
nie mogą sobie poradzić, na przykład: apostrof'
.Regex mogą być również wykorzystywane
\b[a-zA-Z]
do identyfikacji charakteru wyjściowej słowem po granicy słowa\b
, to musimy po prostu zastąpić meczu przez jego górną część obudowy równoważności dziękiRegex.Replace(string input,string pattern,MatchEvaluator evaluator)
metodzie:Wyrażenie regularne można w razie potrzeby dostroić, na przykład, jeśli chcemy obsłużyć przypadki
MacDonald
i,McFry
wyrażenie regularne staje się:(?<=\b(?:mc|mac)?)[a-zA-Z]
Jeśli musimy obsłużyć więcej prefiksów musimy tylko zmodyfikować grupę
(?:mc|mac)
, na przykład, aby dodać french przedrostkidu, de
:(?:mc|mac|du|de)
.Wreszcie, możemy zdać sobie sprawę, że to wyrażenie regularne będzie również pasowało do przypadku
MacDonald'S
ostatniego,'s
więc musimy zająć się nim w wyrażeniu regularnym z negatywnym spojrzeniem w tył(?<!'s\b)
. Na koniec mamy:źródło
\b[ivxlcdm]+$|
tak jest\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
. Będzie składać się z wszystkich końcowych słów nazwy mającej nieścisły format liczb rzymskich (ivxlcdm
). Możesz jednak mieć niepożądane wyniki, na przykład „Li” zmieni się w „LI”Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
Mc i Mac to powszechne przedrostki nazwisk w całych Stanach Zjednoczonych, ale są też inne. TextInfo.ToTitleCase nie obsługuje takich przypadków i nie powinien być używany do tego celu. Oto jak to robię:
źródło
ToTitleCase () powinno działać dla Ciebie.
http://support.microsoft.com/kb/312890
źródło
Najbardziej bezpośrednią opcją będzie użycie funkcji ToTitleCase, która jest dostępna w .NET, która powinna zajmować się nazwą przez większość czasu. Jak zauważył Edg , jest kilka nazw, dla których to nie zadziała, ale są one dość rzadkie, więc jeśli nie celujesz w kulturę, w której takie nazwy są powszechne, nie jest konieczne coś, o co musisz się zbytnio martwić.
Jeśli jednak nie pracujesz z językiem .NET, to zależy od tego, jak wygląda dane wejściowe - jeśli masz dwa oddzielne pola na imię i nazwisko, możesz po prostu zamienić pierwszą literę na wielką, a resztę za pomocą podciągi.
Jeśli jednak otrzymałeś kilka nazwisk jako część tego samego ciągu, musisz wiedzieć, w jaki sposób otrzymujesz informacje i odpowiednio je podzielić . Więc jeśli otrzymujesz imię takie jak „John Doe”, podziel ciąg na podstawie znaku spacji. Jeśli jest w formacie takim jak „Kowalski, Jan”, będziesz musiał podzielić go na podstawie przecinka. Jednak po rozdzieleniu wystarczy zastosować kod pokazany wcześniej.
źródło
CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("moje imię");
zwraca ~ My Name
Ale problem nadal istnieje w przypadku nazw takich jak McFly, jak wspomniano wcześniej.
źródło
Używam własnej metody, aby to naprawić:
Na przykład wyrażenie: „witaj świecie. Witaj, to jest świat przepełnienia stosów”. będzie „Hello World. Hello This Is The Stackoverflow World.”. Regex \ b (początek słowa) \ w (pierwszy znak słowa) załatwi sprawę.
źródło
Sugestie dotyczące użycia ToTitleCase nie będą działać w przypadku ciągów zawierających wielkie litery. Więc będziesz musiał wywołać ToUpper na pierwszym znaku i ToLower na pozostałych.
źródło
Ta klasa załatwia sprawę. Możesz dodać nowe przedrostki do statycznej tablicy ciągów _prefixes .
źródło
Jeśli używasz vS2k8, możesz użyć metody rozszerzającej, aby dodać ją do klasy String:
źródło
Char.ToUpper(input[0]) + input.Substring(1)
jest bardziej czytelny IMHO.input.FirstLetterToUpper()
jest z pewnością bardziej czytelne w porównaniu zChar.ToUpper(input[0]) + input.Substring(1)
, ale mniej przejrzysteAby obejść niektóre problemy / problemy, które zostały wyróżnione, sugerowałbym najpierw przekonwertowanie ciągu znaków na małe litery, a następnie wywołanie metody ToTitleCase. Następnie możesz użyć IndexOf („Mc”) lub IndexOf („O \”), aby określić szczególne przypadki, które wymagają bardziej szczegółowej uwagi.
źródło
Lubię ten sposób:
Zaczerpnięte z tego artykułu MSDN .
źródło
Mam nadzieję, że to ci pomoże.
źródło
źródło
Jak wskazał Edg, będziesz potrzebować bardziej złożonego algorytmu do obsługi nazw specjalnych (prawdopodobnie dlatego wiele miejsc wymusza pisanie wielkich liter).
Coś takiego jak ten nieprzetestowany C # powinno obsłużyć prosty przypadek, o który prosiłeś:
źródło