Util.FormatString Method
The FormatString method builds a string from a format template
and data arguments. This method uses a similar syntax as
String.Format in
ASP.NET. The FormatString method uses braces {} to indicate
the presence of an item to format.
General Syntax:
strFormatted = Util.FormatString "Format Template {0} {1} {2}", argument0, argument1, argument2, ...
Format Item Syntax:
Each format item must be enclosed within braces. You may specify empty
braces if you just want to insert the item, or specify a number to specify which
specific the item to insert. Additionally, you may specify the encoding to
transform the text before inserting it to the formatted string. {[iIndexArgument[&chEncoding]]}
Index Argument
The index component, also called the argument index, is a number
starting from 0 that identifies a corresponding item from the data arguments.
That is, the format item whose argument index is 0 formats the first value from
the data argument list, the format item whose argument index is 1 formats the
second value in the list, and so on.
Multiple format items can refer to the same element in the list of values by
specifying the same argument index. For example, you can format (encode) the
same argument in HTML and URL by specifying a format template like this:
strArgument = "(x+y) < z"
strFormatted = Util.FormatString("String={0}, Text={0&t}, URL(href)={0&u}, URL={0&U}", strArgument)
' strFormatted = " String=(x+y) < z, Text=(x+y) < z, URL(href)=(x+y)+%3C+z, URL=%28x%2By%29+%3C+z"
Each format item can refer to any argument index. For example, if there are
three values, you can format the second, first, and third value by specifying a
format template like this: "{1} {0} {2}" . A value that is not referenced by a
format item is ignored. An error message is displayed if an argument index is outside the bounds of
the list of values.
Finally, the argument index is optional. If you specify no argument index,
the routine will assume the next argument index. For example, the format template "{0} {1} {2}" is the same as
"{} {} {}" or "{} {1} {}" .
Encoding
The encoding is handy for transforming a string into a different format.
For instance, if you are formatting an URL, you may want to specify the encoding {&u}
to transform the text into a valid URL. The FormatString
method supports eight different encoding:
Encoding |
Description |
{&t} |
Encode the text for HTML output. Any special
character reserved by HTML are encoded so the browser displays them as
text. Internally, this encoding uses
HtmlEncode . |
{&u} |
Encode the string to make sure the URL does not contain
illegal characters. Internally, this encoding uses HrefEncode . |
{&U} |
Encode any non-alphanumeric to produce a valid URL.
This is often not necessary, as the {&u} encoding does
the work and makes the encoded string much easier to read.
Internally, this encoding uses UrlEncode . |
{&x} |
Encode the string for XML output. XML Encoding is
similar to HTML encoding with minor differences such as encoding the new
line character into rather than <br /> . |
{&X} |
Same as {&x} with safe encoding.
Again, this encoding is rarely used because XML has built-in Unicode
support. You may use this encoding to create an XML file for
legacy tools not supporting UTF-8. |
{&j} |
Encode the text for a JavaScript string.
Internally, this encoding uses JavaScriptEncode . |
{&J} |
Encode the text for a JavaScript string with safe
encoding for Unicode characters. For details about JavaScript encoding, please read this. |
In the example above, we introduced the encoding with the index
argument. For instance, the encoding of "(x+y) < z"
produces the following.
Encoding |
Encoded result for "(x+y) < z" |
{&t} Text |
"(x+y) < z" |
{&T} Text |
"(x+y) < z" |
{&u} Url |
"(x+y)+%3C+z" |
{&U} Url |
"%28x%2By%29+%3C+z" |
{&x} Xml |
"(x+y) < z" |
{&X} Xml |
"(x+y) < z" |
{&j} JavaScript |
"(x+y) \x3C z" |
{&J} JavaScript |
"(x+y) \x3C z" |
Usage:
The benefit of using the FormatString method is to make the code
more readable by avoiding mixing text and data arguments. For instance,
instead of having:
strName = "Daniel"
str = "Hello " & Util.HtmlEncode(strName) & ", how are you?"
You could have:
strName = "Daniel"
str = "Hello {&t}, how are you?", strName
At first, the benefit may not appear significant, however you will find using a
template very handy if you have several data arguments . Another benefit is
for translating a report to a foreign language. For instance, you can
store the format template in the language
dictionary and use FormatString to insert the data argument
within the translated text. Here is an example of storing an error message
in the dictionary. The error message has two parameters, the file name and
the error code. As a coding style, the
name starts with fmt for "format template" and the number 2
represents the number of arguments.
<!-- File Dictionary.xml -->
<Dictionary>
<ReportGenerator>
<fmt2ErrorFileOpen T="Unable to open file {0} (error code: {1})" />
</ReportGenerator>
</Dictionary>
In your HTML template, you can use the following:
strFileName = "MyFamilyTree.txt"
nErrorCode = 5
strError = Util.FormatString(LanguageDictionary("fmt2ErrorFileOpen"), strFileName, nErrorCode)
' strError = " Unable to open file MyFamilyTree.txt (error code: 5)"
Later, you can change to the following: <fmt2ErrorFileOpen T="Error
{1}: Unable to open file
{0}" /> without having to modify the HTML template. If you
translate in a foreign language, say French, you may use the following:
<fmt2ErrorFileOpen T="L'erreur {1} s'est
produite en ouvrant le fichier {0}" /> .
No {&h} Encoding?
You may have noticed there is no {&h} encoding.
Originally, GenoPro was using {&h} for HTML encoding, however
this notation was ambiguous with the HrefEncode .
While building the first report templates, GenoPro frequently made the mistake
of using the {&h} notation for encoding the href
attribute. After all, writing Util.FormatString("<a href='{&h}'>Click
Me</a>", strURL) was intuitive, but erroneous because the href
attribute must be URL-encoded. As a result, the {&h}
notation has been completely removed to eliminate potential mistakes.
strURL = "http://www.mywebsite.com/My Family"
strHyperlink = Util.FormatString("<a href='{&u}'>Click to view my family tree</a>", strURL)
' strHyperlink = " <a href='http://www.mywebsite.com/My+Family'>Click to view my family tree</a>"
Error Handling:
When the FormatString method encounters an error such as an invalid
encoding or index argument out of range, an error is displayed to the message
log. The returned formatted string is truncated at the error, so
you can trace the exact position of the error.
See Also:
Report.WriteFormatted
|