Есть ли альтернатива для printf?

Не утруждайте себя собственной проверкой. .NET 4.0 значительно улучшил проверку с помощью класса MailAddress . Просто используйте MailAddress address = new MailAddress(input), и если он выбрасывает, это недействительно. Если есть какая-либо возможная интерпретация вашего ввода в качестве спецификации адреса электронной почты, совместимой с RFC 2822, она будет анализировать ее как таковую. Режимы выше, даже в первой статье MSDN, ошибочны, потому что они не учитывают отображаемое имя, цитированную локальную часть, значение литерального домена для домена, исправляют спецификации точки-атома для локальной части, возможность того, что адрес электронной почты может быть в угловых скобках, нескольких значениях кавычек для отображаемого имени, экранированных символов, unicode в отображаемом имени, комментариях и максимальной допустимой длине адресной почты. Я потратил три недели на повторную запись парсера почтовых адресов в .NET 4.0 для System.Net.Mail и доверяю мне, это было намного сложнее, чем просто придумать какое-то регулярное выражение, так как есть много крайних случаев. Класс MailAddress в .NET 4.0 beta 2 будет иметь эту улучшенную функциональность.

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

21
задан ereOn 12 October 2010 в 09:01
поделиться

4 ответа

POSIX printf() поддерживает позиционные аргументы.

printf("Hi %1$s, you are %2$s.", name, status);
printf("Vous êtes %2$s, bonjour %1$s !", name, status);
25
ответ дан Ignacio Vazquez-Abrams 12 October 2010 в 09:01
поделиться

boost.format поддерживает это так же, как в python, однако это для C ++

11
ответ дан Vinzenz 12 October 2010 в 09:01
поделиться

Вам нужно расширение% n $ s, которое является общим для большинства систем Unix.

"Hi %1$s, you are %2$s."

См. Немецкий пример внизу. printf

. Относительно DaveF

.
9
ответ дан David Allan Finch 12 October 2010 в 09:01
поделиться
1118 Я не имею в виду быть носителем плохих новостей, но то, что вы предлагаете, на самом деле плохая идея. Я работаю в компании, которая очень серьезно относится к i18n, и мы обнаружили (мучительно), что нельзя просто вставить слова в подобные предложения, поскольку они часто не имеют смысла.

То, что мы делаем, это просто отключаем текст ошибки от битов переменных, чтобы избежать этих проблем. Например, мы сгенерируем ошибку:

XYZ-E-1002 Frobozz not configured for multiple zorkmids (F22, 7).

А затем, в описании ошибки, вы просто утверждаете, что двумя значениями в скобках в конце были идентификатор Frobozz и число о зоркмидах, которые вы пытались нанести ему.

Это делает перевод i18n невероятно простой задачей, поскольку во время перевода у вас есть все необходимых вам языковых элементов, не беспокоясь о том, должны ли переменные биты быть единственными или множественными, сначала мужскими или женскими. Второе или третье склонение (что бы это ни значило на самом деле).

Команда переводчиков просто должна конвертировать "Frobozz not configured for multiple zorkmids", и это намного проще.


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

В какой-то момент кто-то представил следующее:

The {name} {object} is invalid

где {name} - имя объекта (клиенты, заказы и т. Д.), А {object} - сам тип объекта (таблица, файл, документ, хранимая процедура и т. д.).

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

Хотя «документ клиента» переведен правильно (в позиционном смысле) в Kundendokument, проблема заключалась в том, что строка формата имела пробел между двумя словами. Это было в основном потому, что разработчики пытались сделать предложение более естественным, но, к сожалению, только более естественным, исходя из своего ограниченного опыта.

Большая проблема была с «хранимой процедурой клиентов», которая стала gespeichertes Verfahren der Kunden, буквально «хранимой процедурой клиентов». В то время как немецкие клиенты, возможно, смирились с пробелом в Kunden dokument, нет никакого способа навязать gespeichertes Verfahren der Kunden на {name} {object} успешно.

Теперь вы можете сказать, что более умная строка формата исправила бы это, но есть несколько причин, по которым это было бы неправильно:

  • это очень простой пример, вероятно, будут другие сложный (я бы попробовал привести несколько примеров, но наши переводчики ясно дали понять, что у них есть более неотложная работа, чем подчиняться каждой моей прихоти).
  • Весь смысл строк формата заключается во внешнем переводе. Если сами строки формата специфичны для цели перевода, вы очень мало выиграли, извлекая текст.
  • разработчикам не нужно заботиться о форматных строках, подобных {possible-pre-adjectives} {possible-pre-owner} {object} {possible-post-adjectives} {possible-post-owner} {possible-postowner-adjectives}. Это работа команд перевода , так как они понимают нюансы.

Обратите внимание, что знакомство с разъединением обходит эту проблему как нельзя лучше:

The object specified by <parameter 1>, of type <parameter 2>, is invalid.
    Parameter 1 = {name}.
    Parameter 2 = {object}.
Der sache nannte <parameter 1>, dessen art <parameter 2> ist, ist falsch. 
    Parameter 1 = {name}.
    Parameter 2 = {object}.

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

25
ответ дан paxdiablo 12 October 2010 в 09:01
поделиться