Как получить числа из строки в C #?

#c#

#c#

Вопрос:

 string str="this image has the width of 200px and height of 100px.";
int width, height;
  

Как я могу закодировать, чтобы получить

 width= 200;
height=100;
  

Если ширина больше 150, я уменьшу ширину до 150 и вычислю высоту

 if(width>150)
{
 height=(height*150)/200;
 width=150;
}
  

И результирующая строка будет..

 str="this image has the width of 150px and height of 75px.";
  

Я знаю substring() indexOf() split()

Я знаю, что могу разделить строку с помощью «width», но я не знаю, как найти номер этой разделенной строки.

Комментарии:

1. Строка всегда такая, и меняются только числа?

2. Ради тех, кому также придется работать с вашим кодом в будущем, пожалуйста, переименуйте эти элементы в width и height !

3. строка изменится, но ширина и высота не изменятся.

Ответ №1:

Вы можете сделать это так:

 string str = "this image has the width of 200px and height of 100px.";
string[] numbers = Regex.Split(str, @"D ");
// let's say 100x100 is default, so if TryParse fails you get 100x100
int width = 100;
int height = 100;
if (numbers.Length > 1)
{
    Int32.TryParse(numbers[0], out width);
    Int32.TryParse(numbers[1], out height);
}
  

Комментарии:

1. Поскольку вы имеете дело с небезопасным вводом, вам следует использовать Int32.TryParse , а не Convert.ToInt32 перехватывать случаи, когда значение переполняется. В противном случае строка из пятидесяти ‘9’ символов приведет к сбою вашего кода.

2. Это немного лучше, хотя вы не проверяете, содержит ли массив чисел достаточное количество чисел: P

Ответ №2:

В этом есть несколько частей. Сначала я бы предложил регулярное выражение для сопоставления части строки и явного захвата ее числовых частей.

например, возможное регулярное выражение может быть:

 widthsofs(?<width>d )pxsandsheightsofs(?<height>d )px
  

Что соответствует «ширине XXXpx и высоте YYYpx», где XXX записывается как именованная группа width , а YYY записывается как именованная группа height .

Вот код до сих пор:

 string str="this image has the width of 200px and height of 100px.";
var regex = new Regex(@"widthsofs(?<width>d )pxsandsheightsofs(?<height>d )px");
var match = regex.Match(str);
  

Теперь у этого match есть 2 группы с именами width и height , как описано ранее. Затем вы используете can use int.Parse в группах захвата, чтобы получить значения в виде чисел:

 var width = int.Parse(match.Groups["width"].Value);
var height = int.Parse(match.Groups["height"].Value);
  

Последняя часть, изменение числа и переформулировка строки, которую вы, похоже, хорошо понимаете, поэтому я не включил это.

Вот живой пример, демонстрирующий все вышесказанное: http://rextester.com/rundotnet?code=CLPS3633

Ответ №3:

Вы можете выполнить сопоставление с регулярным выражением и сэкономить 200 100.

 Dim match As System.Text.RegularExpressions.Match = System.Text.RegularExpressions.Regex.Match(str, "this image has the width of (d )px and height of (d )px.")
  

После этого найдите значения в:

 match.Groups(0).Value
match.Groups(1).Value
  

Для C # это

 match.Groups[0].Value;
match.Groups[1].Value;
  

Ответ №4:

Если формат строки всегда такой, это становится довольно тривиальной задачей. По сути, вам просто нужно разделить строку с помощью » » в качестве разделителя и получить строки из результирующего массива в позиции 6 и 10. Затем просто вычтите последние 2 символа «px» и попробуйте преобразовать в int. У вас это есть. Или просто используйте какое-нибудь необычное регулярное выражение, как наверняка предложат другие.

Ответ №5:

int.Parse (строка) или int.TryParse (string, out int) — это, вероятно, методы, которые вы хотите использовать для преобразования строки в int.

Например:

 int width;
if (int.TryParse (widthString, out width) == true)
{
    Console.WriteLine ("The width is {0}", width);
}
else
{
    Console.WriteLine ("{0} could not be converted to an int.", widthString);
}
  

Ответ №6:

Используйте регулярное выражение, метод Matches

  string str = "this image has the width of 200px and height of 100px.";
 var  numbers = Regex.Matches(str,@"d ");
 int no1, no2;

 if (numbers.Count == 2)
  {
    int.TryParse(numbers[0].Value, out no1);
    int.TryParse(numbers[1].Value, out no2);
 }