Есть ли способ конвертировать строки формата C для строк формата C # в C # /. NET 2.0? - PullRequest
2 голосов
/ 04 ноября 2010

Так что я хотел бы преобразовать строку следующим образом:

"Bloke %s drank %5.2f litres of booze and ate %d bananas"

с эквивалентом C # для методов .Format или .AppendFormat

"Bloke {0} drank {1,5:f2} litres of booze and ate {2} bananas"

извините, но я не уверен, есливерсия C # была правильной, но у вас есть идея.Решение не обязательно должно быть идеальным, но оно должно охватывать основной случай.

Спасибо & BR -Matti

ответил на мой другой вопрос Как написать шаблон регулярного выражения C # для соответствия основному printfстроки формата, такие как "% 5.2f"?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2010

Первая попытка: this (своего рода) игнорирует все, что находится между % и одним из diouxXeEfFgGaAcpsn, и заменяет его на {k}, где k изменяется от 0 до максимум 99 (не проверяется в коде: больше чем 100 % во входных данных возвращает неправильную строку формата).

Это не учитывает * в специальной директиве.

#include <string.h>

void convertCtoCSharpFormat(char *dst, const char *src) {
  int k1 = 0, k2 = 0;
  while (*src) {
    while (*src && (*src != '%')) *dst++ = *src++;
    if (*src == '%') {
      const char *percent;
      src++;
      if (*src == '%') { *dst++ = '%'; continue; }
      if (*src == 0) { /* error: unmatched % */; *dst = 0; return; }
      percent = src;
      /* ignore everything between the % and the conversion specifier */
      while (!strchr("diouxXeEfFgGaAcpsn", *src)) src++;

      /* replace with {k} */
      *dst++ = '{';
      if (k2) *dst++ = k2 + '0';
      *dst++ = k1++ + '0';
      if (k1 == 10) { k2++; k1 = 0; }
      /* *src has the conversion specifier if needed */
      /* percent points to the initial character of the conversion directive */
      if (*src == 'f') {
        *dst++ = ',';
        while (*percent != 'f') *dst++ = *percent++;
      }
      *dst++ = '}';
      src++;
    }
  }
  *dst = 0;
}

#ifdef TEST
#include <stdio.h>
int main(void) {
  char test[] = "Bloke %s drank %5.2f litres of booze and ate %d bananas";
  char out[1000];

  convertCtoCSharpFormat(out, test);
  printf("C fprintf string: %s\nC# format string: %s\n", test, out);
  return 0;
}
#endif
0 голосов
/ 04 ноября 2010

Возможно, вы могли бы просто использовать StringBuilder.Replace().

StringBuilder cString = new StringBuilder("Bloke %s drank %5.2f litres of booze and ate %d bananas");
cString.Replace("%s","{0}");
cString.Replace("%5.2f", "1,5:f2"); // I am unsure of this format specifier
cString.Replace("%d", "{2}");

string newString = String.Format(cString.ToString(), var1, var2, var3);

Возможно, вы могли бы добавить что-то вроде этого в качестве метода расширения для String, но я думаю, что вашей самой большой проблемой будут специально отформатированные спецификаторы,Если это нетривиально в этом аспекте, вам может понадобиться разработать регулярное выражение, чтобы поймать их и выполнить замену осмысленно.

...