как мне прописать первую букву имени и фамилии в c #?

<p>есть ли простой способ сделать заглавной первую букву строки и опустить ее? есть встроенный метод или мне нужно сделать свой собственный?</p>

<p><code>textinfo.totitlecase()</code> использует первый символ в каждом токене строки.<br> если нет необходимости поддерживать верхний регистр аббревиатуры, вам следует включить <code>tolower()</code>.</p><pre><code>string s = "john doe"; s = cultureinfo.currentculture.textinfo.totitlecase(s.tolower()); // produces "john doe" </code></pre><p>если currentculture недоступен, используйте:</p><pre><code>string s = "john doe"; s = new system.globalization.cultureinfo("en-us", false).textinfo.totitlecase(s.tolower()); </code></pre><p>смотрите <a href="http://msdn2.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx">msdn link</a> для подробного описания.</p>

<pre><code>cultureinfo.currentculture.textinfo.totitlecase("hello world"); </code></pre>

<pre><code>string test = "hello how are you"; string s = cultureinfo.currentculture.textinfo.totitlecase(test); </code></pre><p>приведенный выше код не будет работать .....</p><p>поэтому поместите приведенный ниже код, преобразовав в нижний, затем примените</p><pre><code>string test = "hello how are you"; string s = cultureinfo.currentculture.textinfo.totitlecase(test.tolower()); </code></pre>

<p>есть несколько случаев, которые <code>cultureinfo.currentculture.textinfo.totitlecase</code> не может обработать, например: апостроф <code>'</code>.</p><pre><code>string input = cultureinfo.currentculture.textinfo.totitlecase("o'reilly, m'grego, d'angelo"); // input = o'reilly, m'grego, d'angelo </code></pre><p><strong> регулярное выражение </strong> также можно использовать <code>\b[a-za-z]</code> для определения начального символа word после границы слова <code>\b</code>, тогда нам нужно просто заменить совпадение его верхним эквивалентность регистра благодаря методу <a href="http://msdn.microsoft.com/fr-fr/library/vstudio/ht1sxswy%28v=vs.110%29.aspx"><code>regex.replace(string input,string pattern,matchevaluator evaluator)</code></a> :</p><pre><code>string input = "o'reilly, m'grego, d'angelo"; input = regex.replace(input.tolower(), @"\b[a-za-z]", m => m.value.toupper()); // input = o'reilly, m'grego, d'angelo </code></pre><p><strong> регулярное выражение </strong> можно настроить при необходимости, например, если мы хотим обработать случаи <code>macdonald</code> и <code>mcfry</code>, регулярное выражение становится: <code>(?<=\b(?:mc|mac)?)[a-za-z]</code></p><pre><code>string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry"; input = regex.replace(input.tolower(), @"(?<=\b(?:mc|mac)?)[a-za-z]", m => m.value.toupper()); // input = o'reilly, m'grego, d'angelo, macdonald's, mcfry </code></pre><p>если нам нужно обработать больше префиксов, нам нужно только изменить группу <code>(?:mc|mac)</code>, например, чтобы добавить французские префиксы <code>du, de</code>: <code>(?:mc|mac|du|de)</code>.</p><p>наконец, мы можем понять, что это <strong> регулярное выражение </strong> также будет соответствовать регистру <code>macdonald's</code> для последнего <code>'s</code>, поэтому нам нужно обработать его в <strong> регулярное выражение </strong> с отрицательным взглядом за <code>(?<!'s\b)</code>. в конце мы имеем:</p><pre><code>string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry"; input = regex.replace(input.tolower(), @"(?<=\b(?:mc|mac)?)[a-za-z](?<!'s\b)", m => m.value.toupper()); // input = o'reilly, m'grego, d'angelo, macdonald's, mcfry </code></pre>

<p>mc и mac - распространенные префиксы фамилий в сша, и есть другие. textinfo.totitlecase не обрабатывает эти случаи и не должен использоваться для этой цели. вот как я это делаю:</p><pre><code> public static string totitlecase(string str) { string result = str; if (!string.isnullorempty(str)) { var words = str.split(' '); for (int index = 0; index < words.length; index++) { var s = words[index]; if (s.length > 0) { words[index] = s[0].tostring().toupper() + s.substring(1); } } result = string.join(" ", words); } return result; } </code></pre>

<p>totitlecase () должен работать для вас.</p><p> <a href="http://support.microsoft.com/kb/312890">http://support.microsoft.com/kb/31289</a> </p>

<p>наиболее прямым вариантом будет использование функции <a href="http://support.microsoft.com/kb/312890">totitlecase</a> , доступной в .net, которая должна заботиться о имени большую часть времени. как <a href="https://stackoverflow.com/questions/72831/how-do-i-capitalize-first-letter-of-first-name-and-last-name-in-c#72850">edg</a> указал, что есть некоторые имена, которые не будут работать, но они довольно редки, поэтому, если вы не ориентируетесь на культуру, где такие имена распространены, вам не нужно беспокоиться о чем-то много о.</p><p>однако, если вы не работаете с языком .net, то это зависит от того, как выглядит ввод - если у вас есть два отдельных поля для имени и фамилии, то вы можете просто использовать заглавную букву, а нижнюю - оставшуюся, используя подстроки.</p><pre><code>firstname = firstname.substring(0, 1).toupper() + firstname.substring(1).tolower(); lastname = lastname.substring(0, 1).toupper() + lastname.substring(1).tolower(); </code></pre><p>однако, если вам предоставлено несколько имен как часть одной и той же строки, вам нужно знать, как вы получаете информацию и <a href="http://msdn.microsoft.com/en-us/library/ms228388(vs.80).aspx">разделить ее</a> соответственно. поэтому, если вы получаете имя типа "джон доу", вы разбиваете строку на основе символа пробела. если он в таком формате, как "доу, джон", вам нужно разделить его на основе запятой. однако, как только вы разберетесь, вы просто примените код, показанный ранее.</p>

<p>я использую свой собственный метод, чтобы исправить это:</p><p>например, фраза: "привет, мир. привет, это мир переполнения стека". будет "hello world. привет, это мир stackoverflow." regex\b (начало слова)\w (первый характер слова) сделает свое дело.</p><pre><code>/// <summary> /// makes each first letter of a word uppercase. the rest will be lowercase /// </summary> /// <param name="phrase"></param> /// <returns></returns> public static string formatwordswithfirstcapital(string phrase) { matchcollection matches = regex.matches(phrase, "\\b\\w"); phrase = phrase.tolower(); foreach (match match in matches) phrase = phrase.remove(match.index, 1).insert(match.index, match.value.toupper()); return phrase; } </code></pre>

<p>cultureinfo.currentculture.textinfo.totitlecase ("мое имя");</p><p>возвращает ~ мое имя</p><p>но проблема все еще существует с такими именами, как mcfly, как указано ранее.</p>

<p>этот класс делает свое дело. вы можете добавить новые префиксы в массив статических строк <strong>\_ префиксы</strong>.</p><pre><code>public static class stringextensions { public static string topropercase( this string original ) { if( string.isnullorempty( original ) ) return original; string result = \_propernamerx.replace( original.tolower( cultureinfo.currentculture ), handleword ); return result; } public static string wordtopropercase( this string word ) { if( string.isnullorempty( word ) ) return word; if( word.length > 1 ) return char.toupper( word[0], cultureinfo.currentculture ) + word.substring( 1 ); return word.toupper( cultureinfo.currentculture ); } private static readonly regex \_propernamerx = new regex( @"\b(\w+)\b" ); private static readonly string[] \_prefixes = { "mc" }; private static string handleword( match m ) { string word = m.groups[1].value; foreach( string prefix in \_prefixes ) { if( word.startswith( prefix, stringcomparison.currentcultureignorecase ) ) return prefix.wordtopropercase() + word.substring( prefix.length ).wordtopropercase(); } return word.wordtopropercase(); } } </code></pre>

<p>предложения по использованию totitlecase не будут работать для строк, которые все в верхнем регистре. поэтому вам придется вызывать toupper для первого символа и tolower для остальных символов.</p>

<p>если вы используете vs2k8, вы можете использовать метод расширения, чтобы добавить его в класс string:</p><pre><code>public static string firstlettertoupper(this string input) { return input = input.substring(0, 1).toupper() + input.substring(1, input.length - 1); } </code></pre>

<p>чтобы обойти некоторые проблемы, которые были выделены, я бы предложил сначала преобразовать строку в нижний регистр, а затем вызвать метод totitlecase. затем вы можете использовать indexof ("mc") или indexof ("o\'"), чтобы определить особые случаи, требующие более пристального внимания.</p><pre><code>inputstring = inputstring.tolower(); inputstring = cultureinfo.currentculture.textinfo.totitlecase(inputstring); int indexofmc = inputstring.indexof(" mc"); if(indexofmc > 0) { inputstring.substring(0, indexofmc + 3) + inputstring[indexofmc + 3].tostring().toupper() + inputstring.substring(indexofmc + 4); } </code></pre>

<pre><code> public static string converttocaptilize(string input) { if (!string.isnullorempty(input)) { string[] arruserinput = input.split(' '); // initialize a string builder object for the output stringbuilder sboutput = new stringbuilder(); // loop thru each character in the string array foreach (string str in arruserinput) { if (!string.isnullorempty(str)) { var chararray = str.tochararray(); int k = 0; foreach (var cr in chararray) { char c; c = k == 0 ? char.toupper(cr) : char.tolower(cr); sboutput.append(c); k++; } } sboutput.append(" "); } return sboutput.tostring(); } return string.empty; } </code></pre>

<p>мне нравится этот способ:</p><pre><code>using system.globalization; ... textinfo myti = new cultureinfo("en-us",false).textinfo; string raw = "this is all caps"; string firstcaponly = myti.totitlecase(raw.tolower()); </code></pre><p>снято с этого <a href="http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase%28v=vs.100%29.aspx">статья msdn</a> .</p>

<p>надеюсь, это поможет вам.</p><pre><code>string fname = "firstname"; string lname = "lastname"; string capitalizedfname = cultureinfo.currentculture.textinfo.totitlecase(fname); string capitalizedlname = cultureinfo.currentculture.textinfo.totitlecase(lname); </code></pre>