Перед использованием Строки. Формат к формату строка в C#, я хотел бы знать, сколько параметров, которые принимает строка?
Для, например, если бы строка была "{0}, не то же как {1}", я хотел бы знать, что эта строка принимает два параметра Для, например, если строка была "{0}, не то же как {1} и {2}", строка принимает 3 параметра
Как я могу найти это эффективно?
Вы можете использовать STRTOX
(где X - f
f f l
l ul
для беззнаков. ), выбирая для того, что вы хотите. Один из параметров, которые вы даете, - это «конечный указатель», который указывает на первый символ в строке, который мог бы преобразовать , быть преобразован в тип целевого номера.
В вашем случае, что вы, по-видимому, в том, что конечный указатель должен быть в конце строки, указывая, что все символы в строке были преобразованы в тип целевого значения.
Редактировать: Извините, не заметил, что вы упомянули «двойной» в заголовке (но не сам вопрос). Что бы то ни было бы дело, вы бы использовали Strtod
, как также посоветовали пару других.
String.Format
Прибирает строковый аргумент с форматом
значение и объектом объекта Params []
Array, который может иметь дело с произвольным Большие значения элементов.
Для каждого объекта
это метод
.TOSTRING ()
будет призвано к решению этой структуры формата
Редактировать: кажется, что я неправильно раскрыл ваш вопрос. Если вы хотите узнать, сколько аргументов необходимы для вашего формата, вы можете обнаружить, что, используя регулярное выражение:
string pattern = "{0} {1:00} {{2}}, Failure: {0}{{{1}}}, Failure: {0} ({0})";
int count = Regex.Matches(Regex.Replace(pattern,
@"(\{{2}|\}{2})", ""), // removes escaped curly brackets
@"\{\d+(?:\:?[^}]*)\}").Count; // returns 6
AS Benjamin , отмеченных в комментариях, может быть, вам нужно знать номер Разные ссылки. Если вы не используете LINQ, здесь вы идете:
int count = Regex.Matches(Regex.Replace(pattern,
@"(\{{2}|\}{2})", ""), // removes escaped curly brackets
@"\{(\d+)(?:\:?[^}]*)\}").OfType<Match>()
.SelectMany(match => match.Groups.OfType<Group>().Skip(1))
.Select(index => Int32.Parse(index.Value))
.Max() + 1; // returns 2
Это также адрес @ 280Z28 Последняя проблема.
Редактировать на 280Z28: это не проверяет вход, но для любого допустимого ввода даст правильный ответ:
int count2 =
Regex.Matches(
pattern.Replace("{{", string.Empty),
@"\{(\d+)")
.OfType<Match>()
.Select(match => int.Parse(match.Groups[1].Value))
.Union(Enumerable.Repeat(-1, 1))
.Max() + 1;
Вам придется анализировать через строку и найти наибольшее целочисленное значение между {}
... затем добавьте один.
... или подсчитайте количество наборов {}
.
В любом случае, это уродливо. Мне было интересно узнать, почему вы должны быть в состоянии понять этот номер программно.
Отредактируйте
Как упоминалось 280Z28, вам придется объяснить различные идентификации того, что можно включить между {}
(несколько {}
, форматирование строк и т. Д.).
Поскольку многие приложения жестко закодировали имя каталога System32 в пути, MS поместила 64-разрядные системные файлы туда, а не в каталог "System64". 32-разрядные версии теперь идут в каталог 'SysWOW64' (это довольно запутанно). но для предотвращения разрыва 32-разрядных программ система выполняет перенаправление по умолчанию для 32-разрядных процессов, пытающихся получить доступ к каталогу "System32". В большинстве случаев при попытке 32-разрядного приложения получить доступ к% windir %\System32 доступ перенаправляется в% windir %\SysWOW64.
Простой способ обойти это перенаправление - использовать % windir %\Sysnative вместо% windir %\System32. Win64 перенаправит этот каталог в фактический каталог System32.
Для полного отключения этого перенаправления можно использовать API Wow64DisableWow64FsRedirection ()
. Для получения дополнительной информации см. http ://msdn.microsoft.com/en-us/library/aa384187.aspx .
C-M-i ; настройка не требуется.
-121--2801477-Я полагаюсь на ReSharper, чтобы проанализировать это для меня, и жаль, что Visual Studio не поставляется с такой аккуратной функцией.