2017-02-14 8 views
2

Сначала я должен сказать, что я не спрашиваю, как преобразовать целочисленное значение в строчную фразу.Как получить каждое число между словами в строке как отдельное значение для замены

Мой вопрос заключается в том, как получить каждое число между словами в строке как отдельное значение, чтобы заменить 46 000 000 сорок шесть миллионов и 70 000 000 с семьдесят миллионов. Для того, чтобы сделать его проще и не перепутать, например, если значение строки уже существует:

string val1 = "replace1"; 
string val2 = "replace2"; 

и входная строка:

string inputStr = "distance from the Sun ranging from 46 000 000 to 70 000 000 km"; 

, чтобы получить этот результат:

расстояния от Солнца в диапазоне от заменить1 на замену2 км

Я не спрашиваю, как заменить значение на другое значение, мой вопрос заключается в том, как извлечь существующие числа из строки в виде отдельных значений, чтобы заменить их после.

string foundNum1 = "46 000 000"; 
string foundNum2 = "70 000 000"; 

Только тогда я могу использовать метод замены:

string f1 = inputStr.Replace(foundNum1, val1); 
string outStr = f1.Replace(foundNum2, val2); 
+0

Является ли 46 000 000 постоянных? – kat1330

+0

Вы спрашиваете, как заменить * любой * номер, который вы можете встретить в тексте словами? Ответы кажутся слишком тривиальными для того, что вы просите. –

ответ

3

Вот полный ответ на любое количество вам нужно конвертировать:

public static string NumberToWords(int number) 
    { 
     if (number == 0) 
      return "zero"; 

     if (number < 0) 
      return "minus " + NumberToWords(Math.Abs(number)); 

     string words = ""; 

     if ((number/1000000) > 0) 
     { 
      words += NumberToWords(number/1000000) + " million "; 
      number %= 1000000; 
     } 

     if ((number/1000) > 0) 
     { 
      words += NumberToWords(number/1000) + " thousand "; 
      number %= 1000; 
     } 

     if ((number/100) > 0) 
     { 
      words += NumberToWords(number/100) + " hundred "; 
      number %= 100; 
     } 

     if (number > 0) 
     { 
      if (words != "") 
       words += "and "; 

      var unitsMap = new[] { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; 
      var tensMap = new[] { "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; 

      if (number < 20) 
       words += unitsMap[number]; 
      else 
      { 
       words += tensMap[number/10]; 
       if ((number % 10) > 0) 
        words += "-" + unitsMap[number % 10]; 
      } 
     } 

     return words; 
    } 


    public string ConvertStringNumbersToWrittenForm(string inputStr) 
    { 
     var regex = new Regex(@"[\d][\d ]+[\d]"); 

     var matches = regex.Matches(inputStr); 
     string newString = inputStr; 
     foreach (var match in matches) 
     { 
      string matchStr = match.ToString(); 
      //eliminate spaces 
      matchStr = matchStr.Replace(" ", string.Empty); 
      newString = newString.Replace(match.ToString(), NumberToWords(Convert.ToInt32(matchStr))); 
     } 

     return newString; 
    } 

Чтобы использовать его, вы звоните:

string wordString = ConvertStringNumbersToWrittenForm("distance from the Sun ranging from 46 000 000 to 70 000 000 km"); 

и wordString будет результирующая строка, с написанными словами, для цифры.

+1

Интересно, если ваше регулярное выражение ['[\ d] [\ d] + [\ d]'] (http://www.regexstorm.net/tester?p=%5b%5cd%5d% 5b% 5cd +% 5d% 2b% 5b% 5cd% 5d & i = 42) будет соответствовать номерам, короче трех символов. Как насчет таких как ['\ b [\ d] + \ b'] (http://www.regexstorm.net/tester?p=%5cb%5b%5cd+%5d%2b%5cb&i=42) –

+0

Вы можете быть правым. Реджикс не мой сильный костюм. Однако регулярное выражение, которое вы предоставили, похоже, не соответствует должным образом. – oppassum

0

Вы можете сделать что-то вроде этого:

string res = inputStr.Replace("46 000 000", val1).Replace("70 000 000", val2); 
+0

Привет, да, но как вы получаете эти значения из строки, прежде чем заменить ее чем-то? – nikorio

+0

, так что вы не знаете, какие цифры будут на строке? ... это может быть 46.000.000 или 5672 ?? – NicoRiff

+0

да любые разные цифры – nikorio

0

Я уверен, что вы делаете это так:

inputStr = inputStr.Replace («46 000 000», «сорок шесть миллионов»);

inputStr = inputStr.Replace («70 000 000», «семьдесят миллионов»);

1

Чтобы сделать это динамически, вы можете использовать регулярные выражения, как следует:

string val1 = "replace1"; 
string val2 = "replace2"; 

string inputStr = "distance from the Sun ranging from 46 000 000 to 70 000 000 km"; 

var regex = new Regex(@"[\d][\d ]+[\d]"); 

var matches = regex.Matches(inputStr); 

inputStr.Replace(matches[0], val1); 
inputStr.Replace(matches[1], val2); 

Просто обратите внимание на следующее:

  • если не два матча, это не wokr
  • Если совпадения совпадают, это всегда будет заменено как
  • , возможно, имеются другие кромки кромки
1

Это вернет вам любую группу цифр.

string inputStr = "distance from the Sun ranging from 46 000 000 to 70 000 000 km"; 
Regex pattern = new Regex(@"([0-9]{1,3}(?:\s[0-9]{3})*)"); 

foreach (Match match in pattern.Matches(inputStr)) 
{ 
    Console.WriteLine(match.Groups[1]); 
} 

Отображается каждое совпадение. Теперь вам просто нужно сделать свою замену так, как вы хотите. Не уверен, что вы там планируете; поэтому я ничего не поставил.