Использование HtmlTextWriter для рендеринга управления сервером?

для проверки ввода является числовым (с плавающей точкой)

blockquote>

1) Принять ввод в виде строки char buf[Big_Enough]. Я ожидаю, что 160 цифр будут обрабатывать все, кроме самых загадочных «плавающих» строк 1 sup>.

#define N 160
char buf[N];
if (fgets, buf, sizeof buf, stdin) {

2) Применить float strtof() для float, (strtod() для double, strtold() для long double).

  char *endptr;  
  errno = 0;
  float d = strtof(buf, &endptr);
  // endptr now points to the end of the conversion, if any.

3) Проверить результаты.

    if (buf == endptr) return "No_Conversion";
    // Recommend to tolerate trailing white-space.
    //   as leading white-spaces are already allowed by `strtof()`
    while (isspace((unsigned char)*endptr) {
      endptr++;
    }
    if (*endptr) return "TrailingJunkFound";
    return "Success";

4) Испытания на крайности, если необходимо.

В этот момент ввод является числовым. Остается вопрос, хорошо ли «конечная строка» может быть представлена ​​конечной float: если a the | result | находится в диапазоне 0 или [FLT_TRUE_MIN...FLT_MAX].

Это включает в себя рассмотрение errno.

Преобразование «успешно», но конечные строковые значения вне диапазона float становятся HUGE_VALF, которые могут быть бесконечностью или FLT_MAX.

Wee | значения | близко к 0.0, но не 0.0 становится чем-то в диапазоне [0.0 ... INT_MIN].

Так как цель состоит в том, чтобы определить, успешно ли выполнено преобразование (оно имело место), я оставлю эти подробности для вопроса, который хочет узнать о том, какое значение .


Альтернативой является использование fscanf() для непосредственного чтения и преобразования, однако обработка ошибок там тоже имеет свои проблемы, которые трудно контролировать.


1 sup> Типичный диапазон float составляет +/- 10 38 sup>. Таким образом, учет 40 или более символов имеет смысл. Точный точный отпечаток FLT_TRUE_MIN может содержать ~ 150 символов. Чтобы отличить произвольно строку «float» от FLT_TRUE_MIN от следующей, более крупной, нужно примерно столько цифр.

Если «плавающие» строки не являются произвольными, а поступают только с выходных данных напечатанного float, тогда требуется намного меньше цифр - около 40.

Конечно, разумно предусмотреть дополнительные начальные / конечные пробелы и нули.

5
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

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

Большая часть кода этого типа, который я изменяю, я инстанцирую серверный объектов, настраиваю их свойства, как желаемый и затем говорю им.RenderControl (устройство записи). Это делает код намного легче читать и работать с. Если существует хит производительности из издержек, это приносит, я готов принять его (на самом деле, приложение обычно работает быстрее после того, как я внес свои изменения, таким образом, анекдотическим образом это не имеет место, но я не представил свой код).

Один простой недостаток к жесткому кодированию, которое - Ваш материал в строках, когда стандарты HTML изменяются. Код я продолжаю работать, был написан в 04/05, и с тех пор <BR> стал <br/> и прописные теги HTML больше не является кошерным и т.д. Если они использовали управление сервером, то управление сервером изменило свой произведенный HTML без нас бывший должный сделать что-либо. Это - всего один простой пример.

Править: О, и btw, BeginRender и EndRender не имеют никакой реализации. Они - заполнители для Вас, чтобы переопределить и обеспечить пользовательскую функциональность в HtmlTextWriter-производном-классе.

EDIT2: Иногда это немного обременительно, чтобы всегда использовать управление сервером, как для контейнеров и материала. Я сделал бы много.Controls. Добавьте () и затем представьте контейнер позже. Таким образом, иногда я делаю это:

writer.AddAttribute(HtmlTextWriterAttribute.Class, "myContainerClass");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
// do some stuff, .RenderControl on some other controls, etc.
writer.RenderEndTag();

Как упомянуто, это представит корректный HTML, даже если HTML отделения изменится в будущем, вызовите, у меня нет трудно кодированных строк.

10
ответ дан 18 December 2019 в 12:02
поделиться

Мудрый производительностью, это потребует, чтобы было сделано больше строковых копий. HtmlTextWriter записи непосредственно к буферу вывода. StringBuilder с другой стороны, имеет его собственный буфер. Когда Вы звоните ToString на StringBuilder, новая строка должна быть создана, и затем она будет записана в буфер вывода output.Write. Это требует, чтобы намного больше работы было сделано.

4
ответ дан 18 December 2019 в 12:02
поделиться

Я не думаю, что необходимо называть BeginRender/EndRender, это сделано страницей.

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

1
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: