#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);
}