Главна първа буква на фамилията

Така че получавам данни за фамилията с главни букви от базата данни. Трябва да форматирам текста, така че първата буква от всяка част от името да е главна. В момента имам кода по-долу, който отчита хора с двойни фамилни имена (напр. SMITH-JONES става Smith-Jones), но докато проверявах резултатите, забелязах, че все още имам грешка, когато става въпрос за имена като VAN BEBBER, което става Van bebber. Някакви предположения?

var fullLast = Last.Split('-');
var lastFormatted = new StringBuilder();

for (var i = 0; i < fullLast.Length; i++)
{
    fullLast[i] = char.ToUpper(fullLast[i][0]) + fullLast[i].Substring(1).ToLower();
    lastFormatted.Append(fullLast[i]);
    if (i != fullLast.Length - 1)
        lastFormatted.Append("-");
}

return string.Format(
    "{0} {1}",
    char.ToUpper(First[0]) + First.Substring(1).ToLower(),
    lastFormatted);

person Desquid    schedule 13.10.2015    source източник
comment
Какво ви пречи да оправите това по същия начин, както оправихте двойните фамилни имена? (Т.е. разделяне на двата знака.)   -  person 31eee384    schedule 13.10.2015
comment
.NET вече има метод ToTitleCase в него.   -  person Dai    schedule 13.10.2015


Отговори (3)


Това е известен проблем с имената - нещата са изключително противоречиви. Прочетете тази статия за повече информация: http://www.w3.org/International/questions/qa-personal-names

Във вашия пример споменавате фамилното име „VAN BEBBER“, което искате да бъде изписано с главна буква като „VanBebber“. Въпреки това, както се посочва в статията, има други комбинации от други части на света, които биха провалили повечето опити за стандартизация - например фамилното име „BIN OSMAN“ би било правилно изписано с главни букви като „binOsman" - няма главно "b" за "bin", което означава "син на" и следователно не се вписва добре в западната концепция за фамилно име.

Споменавате, че разделяте фамилните имена на тирета, което най-вероятно идва от идеята за фамилия с тирета - проверявате ли и собственото име за тирета? Сайтът дава примерното име „María-Jose Carreño Quiñones“ – което е доста трудно за разбор поради двойно собствено име (разделено с тире), както и двойно фамилно име (разделено с интервал). Как вашата програма ще се справи с това име?

За да отговоря на въпроса ви по-директно, без да въвеждате повече главни букви - вече знаете как да разделите низ чрез тирето - ако искате да покриете главните главни имена на фамилните имена с интервали, трябва допълнително да разделите низа на фамилията с интервали, и едва след това главна първата буква на различните разделени низове.

Като алтернатива, както Dai спомена в коментар, можете да използвате метода ToTitleCase - повече информация тук: https://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase(v)=vs.110).aspx Това най-вероятно е по-добро решение, отколкото да се опитвате да направите свой собствен. Въпреки това, тази страница се позовава на факта, че не всички езици се изписват с главни букви по един и същи начин (и наистина различните фамилни имена могат да идват от различни области/култури/езици) и следователно настройването на правилния език може не винаги да доведе до правилното изписване с главни букви на фамилното име. Обърнете внимание, че ще изпише "BIN OSMAN" с главни букви като "BвOsman", което е технически неправилно.

Ето бърз пример от тази страница:

// Defines the String* with mixed casing.
String^ myString = "wAr aNd pEaCe";

// Creates a TextInfo based on the "en-US" culture.
/**** Personal Note - en-US may not be the correct culture for every last name! ****/
CultureInfo^ MyCI = gcnew CultureInfo( "en-US",false );
TextInfo^ myTI = MyCI->TextInfo;

// Changes a String* to lowercase. Outputs "War and Peace"
Console::WriteLine( "\"{0}\" to titlecase: {1}", myString, myTI->ToTitleCase( myString )
person Jake    schedule 13.10.2015

Мисля, че можете да използвате метода ToTitleCase....

CultureInfo cultureInfo = CultureInfo.CurrentCulture; //Or use a specific culture
var str1 = cultureInfo.TextInfo.ToTitleCase("VAN BEBBER".ToLower(cultureInfo));
var str2 = cultureInfo.TextInfo.ToTitleCase("SMITH-JONES".ToLower(cultureInfo));
person Eser    schedule 13.10.2015
comment
var str3 = cultureInfo.TextInfo.ToTitleCase(Nancy O'Neill.ToLower()); хмммм.... Сигурен ли си, че това работи? - person g2000; 13.10.2015
comment
Работи въз основа на специфичен набор от правила за главни букви за всеки език. O'Neill всъщност не е английска дума, така че CultureInfo.CurrentCulture може да не съдържа правило или набор от правила, които биха причинили правилното й изписване с главни букви. Възможно е никой culture да не съдържа правилните правила за този пример. Това е изненадващо труден проблем за решаване. - person Jake; 13.10.2015

Защо не направите разделяне с интервал и след това с '-'. По този начин можете да заснемете всички случаи.

Вижте този пример:

var names = fullName.Split(' ');
        var formatted = new StringBuilder();
        foreach(string name in names)
        {
            if(name.Contains('-'))
            {
                var nonHyphanatedNames = name.Split('-');
                    foreach (var nonHyphanatedName in nonHyphanatedNames)
                    {
                        formatted.Append(char.ToUpper(nonHyphanatedName[0]) + nonHyphanatedName.Substring(1).ToLower() + '-');
                    }

            }
            else
            {
                formatted.Append(char.ToUpper(name[0]) + name.Substring(1).ToLower() + ' ');
            }


        }
        //remove last field
        formatted.Remove(formatted.Length - 1, 1);
        Console.Write(formatted);
person chixcancode    schedule 13.10.2015
comment
Това със сигурност ще улови случаите, които Desquid спомена - обаче, както споменах в отговора си, всъщност има много крайни случаи, когато става дума за имена по целия свят. Ван Бебер е само един такъв случай. - person Jake; 13.10.2015
comment
Всъщност кодът, който предоставих, обхваща и тези крайни случаи. Тъй като „Van Bebber“ е разделено с интервал (' '), това работи - person chixcancode; 13.10.2015
comment
Но не обхваща такива случаи като бин Осман (от моя отговор) или О'Нийл (от коментара на g2000 за друг отговор) - въпросът е, че изписването на имена с главни букви за съжаление не е толкова лесно, колкото разделянето с интервали и/или тирета, след което главните - person Jake; 13.10.2015