11 ответов:
Я могу сделать это для эсперанто, без особых случаев!
string plural(string noun) { return noun + "j"; }для английского языка было бы полезно ознакомиться с правилами для регулярные множественное число существительных, а также неправильное множественное число существительных. Существует целая статья Википедии о английский язык множественное число, который может иметь некоторую полезную информацию тоже.
большинство Ормов имеют удар по нему, хотя они, как правило, не идеальны. Я знаю, что замок имеет Класс Инфлектора вы, вероятно,можете пошарить. Делать это "отлично" - непростая задача (английские" правила "на самом деле не являются правилами :)), поэтому это зависит от того, довольны ли вы подходом" разумного предположения".
Я обманул в Java-я хотел иметь возможность создавать правильную строку для "There were N something(s)", поэтому я написал Фолл. немного перегруженный метод утилиты:
static public String pluralize(int val, String sng) { return pluralize(val,sng,(sng+"s")); } static public String pluralize(int val, String sng, String plu) { return (val+" "+(val==1 ? sng : plu)); }вызывается вот так
System.out.println("There were "+pluralize(count,"something")); System.out.println("You have broken "+pluralize(count,"knife","knives"));
Я создал крошечную библиотеку для этого в .net (C#), называемую Pluralizer (неудивительно).
Он предназначен для работы с полными предложениями, что-то вроде строки.Формат.
это в основном работает так:
var target = new Pluralizer(); var str = "There {is} {_} {person}."; var single = target.Pluralize(str, 1); Assert.AreEqual("There is 1 person.", single); // Or use the singleton if you're feeling dirty: var several = Pluralizer.Instance.Pluralize(str, 47); Assert.AreEqual("There are 47 people.", several);Он также может сделать намного больше, чем это. Читайте об этом подробнее мой блог. Он также доступен в NuGet.
Я сбил один вместе на основе рельсов плюрализатора. Вы можете увидеть мой пост в блоге здесь или на github здесь
output = Formatting.Pluralization(100, "sausage");
как вопрос был для C#, вот хороший вариант решения Software Monkey (опять же немного "чит", но для меня действительно самый практичный и многоразовый способ сделать это):
public static string Pluralize(this string singularForm, int howMany) { return singularForm.Pluralize(howMany, singularForm + "s"); } public static string Pluralize(this string singularForm, int howMany, string pluralForm) { return howMany == 1 ? singularForm : pluralForm; }использование выглядит следующим образом:
"Item".Pluralize(1) = "Item" "Item".Pluralize(2) = "Items" "Person".Pluralize(1, "People") = "Person" "Person".Pluralize(2, "People") = "People"
дозвуковой 3 имеет
Inflectorкласс, который впечатлил меня, повернувPersonнаPeople. Я заглянул в источник и обнаружил, что он, естественно, немного обманывает с жестко закодированным списком, но это действительно единственный способ сделать это на английском языке и как люди это делают - мы помним единственное и множественное число каждого слова и не просто применяем правило. Поскольку нет мужского / женского (/нейтрального), чтобы добавить к смеси, это намного проще.здесь фрагмент:
AddSingularRule("^(ox)en", ""); AddSingularRule("(vert|ind)ices$", "ex"); AddSingularRule("(matr)ices$", "ix"); AddSingularRule("(quiz)zes$", ""); AddIrregularRule("person", "people"); AddIrregularRule("man", "men"); AddIrregularRule("child", "children"); AddIrregularRule("sex", "sexes"); AddIrregularRule("tax", "taxes"); AddIrregularRule("move", "moves"); AddUnknownCountRule("equipment");это объясняет некоторые слова, не имеющие множественных эквивалентов, как пример оборудования. Как вы, наверное, можете сказать, это делает простой
Regexзаменить с помощью $1.обновление:
Это кажется дозвуковымInflectorэто infact Замок ActiveRecordInflectorкласс!
Не так много документации от MSDN по конкретному использованию класса PluralizationService, поэтому вот класс модульного теста (NUnit), чтобы показать основное использование. Обратите внимание на нечетный тестовый случай внизу, который показывает, что служба не идеальна, когда речь заходит о нестандартных формах множественного числа.
[TestFixture] public class PluralizationServiceTests { [Test] public void Test01() { var service = PluralizationService.CreateService(CultureInfo.CurrentCulture); Assert.AreEqual("tigers", service.Pluralize("tiger")); Assert.AreEqual("processes", service.Pluralize("process")); Assert.AreEqual("fungi", service.Pluralize("fungus")); Assert.AreNotEqual("syllabi", service.Pluralize("syllabus")); // wrong pluralization } }
эта страница показывает, как использовать
PluralizationServiceнаSystem.Data.Entity(.NET Framework 4.0)http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
использование базы данных Microsoft Northwind example:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));выделить не выделить "элемент order_details" Он возвращает "Order_Details" с
sв конце. Что такое работа вокруг?
Comments