using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class ZennoPosterRussianNumberConverter
{
private static readonly Dictionary<string, long> NumberWords = new Dictionary<string, long>
{
{"ноль", 0}, {"один", 1}, {"одна", 1}, {"одно", 1}, {"два", 2}, {"две", 2},
{"три", 3}, {"четыре", 4}, {"пять", 5}, {"шесть", 6}, {"семь", 7},
{"восемь", 8}, {"девять", 9}, {"десять", 10}, {"одиннадцать", 11},
{"двенадцать", 12}, {"тринадцать", 13}, {"четырнадцать", 14},
{"пятнадцать", 15}, {"шестнадцать", 16}, {"семнадцать", 17},
{"восемнадцать", 18}, {"девятнадцать", 19}, {"двадцать", 20},
{"тридцать", 30}, {"сорок", 40}, {"пятьдесят", 50}, {"шестьдесят", 60},
{"семьдесят", 70}, {"восемьдесят", 80}, {"девяносто", 90},
{"сто", 100}, {"двести", 200}, {"триста", 300}, {"четыреста", 400},
{"пятьсот", 500}, {"шестьсот", 600}, {"семьсот", 700}, {"восемьсот", 800},
{"девятьсот", 900}, {"тысяча", 1000}, {"тысячи", 1000}, {"тысяч", 1000},
{"миллион", 1000000}, {"миллиона", 1000000}, {"миллионов", 1000000},
{"миллиард", 1000000000}, {"миллиарда", 1000000000}, {"миллиардов", 1000000000}
};
public static string ConvertWordsToNumbers(string text, IZennoPosterProjectModel project)
{
try
{
if (string.IsNullOrEmpty(text))
return text;
// Регулярное выражение для русских числовых слов
string pattern = @"\b(ноль|один|одна|одно|два|две|три|четыре|пять|шесть|семь|восемь|девять|десять|одиннадцать|двенадцать|тринадцать|четырнадцать|пятнадцать|шестнадцать|семнадцать|восемнадцать|девятнадцать|двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто|сто|двести|триста|четыреста|пятьсот|шестьсот|семьсот|восемьсот|девятьсот|тысяча|тысячи|тысяч|миллион|миллиона|миллионов|миллиард|миллиарда|миллиардов)\b";
string[] words = Regex.Split(text.ToLower(), pattern, RegexOptions.IgnoreCase);
string result = text;
string currentNumberWords = "";
bool isProcessingNumber = false;
string ProcessNumberWords(string numberWords)
{
if (string.IsNullOrEmpty(numberWords))
return "";
string[] parts = numberWords.Trim().Split();
long total = 0, current = 0;
foreach (string word in parts)
{
if (NumberWords.TryGetValue(word, out long value))
{
if (value >= 1000) // тысяча, миллион, миллиард
{
current = current == 0 ? 1 : current;
total += current * value;
current = 0;
}
else if (value >= 100) // сотни
{
current = current == 0 ? value : current + value;
}
else // числа от 0 до 90
{
current += value;
}
}
}
total += current;
return total.ToString();
}
for (int i = 0; i < words.Length; i++)
{
if (Regex.IsMatch(words[i], pattern, RegexOptions.IgnoreCase))
{
currentNumberWords += words[i] + " ";
isProcessingNumber = true;
}
else
{
if (isProcessingNumber)
{
string numberString = ProcessNumberWords(currentNumberWords);
string originalNumberWords = text.Substring(result.Length - currentNumberWords.Length, currentNumberWords.Length).Trim();
result = result.Substring(0, result.Length - currentNumberWords.Length) + numberString;
currentNumberWords = "";
isProcessingNumber = false;
}
result = result.Substring(0, result.Length - words[i].Length) + words[i];
}
}
if (isProcessingNumber)
{
string numberString = ProcessNumberWords(currentNumberWords);
result = result.Substring(0, result.Length - currentNumberWords.Length) + numberString;
}
return result;
}
catch (Exception ex)
{
project.SendErrorToLog($"Error in ConvertWordsToNumbers: {ex.Message}", false);
return text; // Возвращаем исходный текст в случае ошибки
}
}
}