// Функция возвращает число прописью с учетом рода единицы измерения public static string NumberToString(long value, WordGender gender) { // version 2 // 15.11.02 - updated // if (value <= 0) if (value < 0) { // (end) 15.11.02 - updated return(""); } // version 2 // 15.11.02 - added if (value == 0) { return(number0); } // (end) 15.11.02 - added return(TernaryToString(value, 5) + TernaryToString(value, 4) + TernaryToString(value, 3) + TernaryToString(value, 2) + TernaryToString(value, 1) + TernaryToString(value, gender)); // (end) 15.11.02 - updated }
///Функция преобразования 3-значного числа, заданного в виде строки, ///с учетом рода (мужской, женский или средний). ///Род учитывается для корректного формирования концовки: ///"один" (рубль) или "одна" (тысяча) private static string TernaryToString(long ternary, WordGender gender) { string s = ""; //учитываются только последние 3 разряда, т.е. 0..999 long t = ternary % 1000; int digit2 = (int)(t / 100); int digit1 = (int)((t % 100) / 10); int digit0 = (int)(t % 10); //сотни if (digit2 > 0) { s = number100_900[digit2 - 1] + " "; } if (digit1 > 1) { s += number20_90[digit1 - 2] + " "; if (digit0 >= 3) { s += number3_9[digit0 - 3] + " "; } else if (digit0 > 0) { //s += number1_2[digit0 - 1, (int) gender] + " "; s += number1_2[(int)gender, digit0 - 1] + " "; } } else if (digit1 == 1) { s += number10_19[digit0] + " "; } else { if (digit0 >= 3) { s += number3_9[digit0 - 3] + " "; } else if (digit0 > 0) { //s += number1_2[digit0 - 1, (int) gender] + " "; s += number1_2[(int)gender, digit0 - 1] + " "; } //!!! Чтобы писАл "нуль" раскоментировать следующие 2 строки : /*else * s += number0 + " ";*/ } return(s.TrimEnd()); }
///Функция возвращает число прописью с учетом рода единицы измерения public static string NumberToString(long value, WordGender gender) { if (value <= 0) { return(""); } else { return(TernaryToString(value, 5) + TernaryToString(value, 4) + TernaryToString(value, 3) + TernaryToString(value, 2) + TernaryToString(value, 1) + TernaryToString(value, gender)); } }
public string GetVerb(WordGender gen, WordTime time) { return((time == WordTime.Future) ? "с" : "" + WordBase + Finalizes[(int)gen, (int)time]); }
public static string GenderToString(WordGender gender) { switch (gender) { case WordGender.Masculine: return "der"; case WordGender.Feminine: return "die"; case WordGender.Neuter: return "das"; case WordGender.MasculineOrNeuter: return "der/das"; case WordGender.None: return ""; default: return ""; } }
public Noun(int wordId, string word, string translation, WordGender gender, string pluralForm, string genitivForm) : base(wordId, WordType.Noun, word, translation) { this.gender = gender; this.pluralForm = pluralForm; this.genitivForm = genitivForm; }
/// <summary> /// Генерирует предложение /// </summary> /// <param name="pattern">Структура предложения</param> /// <returns>Предложение</returns> public static string Generate(string pattern) { List <Word> Unterminates = GetUnterminates(pattern.Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)); bool solved = false; List <Word> Sentence = Unterminates; while (!solved) { solved = true; List <Word> newSentence = new List <Word>(); newSentence.Add(Dot); for (int i = Sentence.Count - 1; i >= 0; i--) { if (Sentence[i].Type == WordType.Unterminate) { solved = false; var subwords = SelectPath(Sentence[i] as UnTerminateWord); for (int k = 0; k < subwords.Count; k++) { if (subwords[k].Type == WordType.Terminate) { ((TerminateWord)subwords[k]).SpellPart = ((UnTerminateWord)Sentence[i]).SpellPart; } } newSentence.InsertRange(0, subwords); } else if (Sentence[i] != Dot) { newSentence.Insert(0, Sentence[i]); } } if (!solved) { Sentence = newSentence; } } var TSentence = Sentence.Select(word => word as TerminateWord).ToList(); StringBuilder builder = new StringBuilder(); WordTime time = (WordTime)Randomize(0, 2); for (int i = 0; i < TSentence.Count; i++) { TerminateWord tword = TSentence[i]; string wordStr = ""; switch (tword.SentencePart) { case Terminate.Существительное: wordStr = (tword as Noun).GetNoun(); break; case Terminate.Глагол: { var verb = (tword as Verb); var noun = TSentence.First(word => word.SentencePart == Terminate.Существительное); WordGender gen = (noun as Noun).Gender; gen = (noun.SpellPart == UnTerminate.Перечисление) ? WordGender.They : gen; wordStr = verb.GetVerb(gen, time); break; } case Terminate.Прилагательное: { var adj = (tword as Adjective); var noun = TSentence.First(word => word.SentencePart == Terminate.Существительное); WordGender gen = (noun as Noun).Gender; gen = (noun.SpellPart == UnTerminate.Перечисление) ? WordGender.They : gen; wordStr = adj.GetAdjective(gen); break; } case Terminate.Предлог: { wordStr = (tword as Pretext).Name; break; } case Terminate.Союз: { wordStr = (tword as Union).Name; break; } default: break; } wordStr = (i > 0) ? wordStr : wordStr.First().ToString().ToUpper() + wordStr.Substring(1); wordStr = (tword == Dot || tword == Comma || i == 0) ? wordStr : " " + wordStr; builder.Append(wordStr); } return(builder.ToString()); }
public string GetAdjective(WordGender gen) { return(WordBase + Finalizes[(int)gen]); }
// Функция преобразования 3-значного числа, заданного в виде строки, // с учетом рода (мужской, женский или средний). // Род учитывается для корректного формирования концовки: // "один" (рубль) или "одна" (тысяча) // version 2 // 15.11.02 - updated private static string TernaryToString(long ternary, WordGender gender) // private static string TernaryToString(int ternary, WordGender gender) // (end) 15.11.02 - updated { var s = ""; // version 2 // 15.11.02 - updated // учитываются только последние 3 разряда, т.е. 0..999 //long t = ternary % 1000; //int digit2 = (int) (t / 100); //int digit1 = (int) ((t % 100) / 10); //int digit0 = (int) (t % 10); var digit2 = ternary / 100; var digit1 = (ternary % 100) / 10; var digit0 = ternary % 10; // (end) 15.11.02 - updated // сотни while (digit2 >= 10) { digit2 %= 10; } if (digit2 > 0) { s = number100_900[digit2 - 1] + " "; } if (digit1 > 1) { s += number20_90[digit1 - 2] + " "; if (digit0 >= 3) { s += number3_9[digit0 - 3] + " "; } else { if (digit0 == 1) { s += number1[(int)gender] + " "; } if (digit0 == 2) { s += number2[(int)gender] + " "; } } } else if (digit1 == 1) { s += number10_19[digit0] + " "; } else { if (digit0 >= 3) { s += number3_9[digit0 - 3] + " "; } else if (digit0 > 0) { if (digit0 == 1) { s += number1[(int)gender] + " "; } if (digit0 == 2) { s += number2[(int)gender] + " "; } } } return(s.TrimEnd()); }
public Noun(string wordBase, WordGender gen) : base(wordBase, Terminate.Существительное) { Gender = gen; }