You can convert data from one type to another in OmniMark in a number of ways:
%
),
binary
operator, and
base
operator.
The following examples show how these facilities can be applied to a number of different data conversion problems.
You can convert a string
to an integer
value simply by using the string
value where an
integer
is expected. OmniMark invokes a built-in conversion function to convert the string
value
to an integer
automatically. The string
used must contain only decimal digits.
process local string s initial { "6" } local integer i initial { 7 } set i to i + s output "i = " || "d" % i
OmniMark's floating point and BCD libraries provide conversion functions for converting from string
s
to float
and BCD
numbers respectively, so string
s are converted to float
s or
BCD
s in the same way:
import "ombcd.xmd" unprefixed process local string s initial { "12.75" } local bcd x initial { "0.25" } set x to x + s output "x = " || "d" % x
You can convert an integer
to a string
expression using the d
format item, as illustrated in the examples above.
The d
format item has many format modifiers that allow you to specify how the number is displayed. For
instance, to display a number as two hexadecimal digits, you would use the sequence 16ru2fzd
. This sequence
means:
16r
- display using radix (or base) 16—hexadecimal,
u
- display using uppercase letters for digits over 9,
2f
- display with a width of 2 digits,
z
- pad the display with leading zeros, and
d
- the d
format item.
Thus the following code will print FD
:
process local integer i initial { 253 } output "16ru2fzd" % i
You can convert a BCD
value to a string
using the BCD
template formatting language.
For instance, the following code outputs $5,729.95
:
import "ombcd.xmd" unprefixed process local bcd total initial { 5729.95 } output "<$,NNZ.ZZ>" % total
To get the ASCII code (or EBCDIC code on machines that use it) for an individual character, you can use the
binary
operator:
process local string s initial {"G"} output "The ASCII code for " || s || " is " || "d" % binary s || "."
To output the character that corresponds to an ASCII code, use the b
format item:
process local integer i initial { 71 } output "The character corresponding to ASCII code " || "d" % i || " is " || "b" % i || "."
You can convert non-base 10 numbers, represented as string
s, into integer
s using the
base
operator. For instance, this program converts the string
representation of a
hexadecimal value to an integer
:
process local string s initial { "7F" } local integer i set i to s base 16 output "d" % i
In some cases, OmniMark cannot tell which data format is intended when you provide a value of a different
type. In this case, OmniMark cannot call the appropriate conversion function and you must specify which type you
intended using a cast. A common example of this can occur when using overloaded operators. For example, the
BCD
and float
libraries both provide overloaded
versions of the +
operator
to work with BCD
and float
values respectively, and also to work with combinations of BCD
or float
values with OmniMark's built-in types.
In the following example, an integer
value is a added to a string
value that expresses a
decimal fraction. The result is then assigned to a BCD
shelf item. Because overloaded
functions are selected based on the types of their arguments, and not on the type of their return values,
OmniMark sees this as the addition of an integer
with a string
. It then throws an exception
complaining that the string
729.95
is not a
valid integer
.
import "ombcd.xmd" unprefixed process local integer i initial { 2 } local string s initial { "729.95" } local bcd x set x to i + s output "<$NNZ.ZZ>" % x
To force OmniMark to select the BCD
version of the +
operator we must force at least one
of the terms to be evaluated as a BCD
value by using a cast:
import "ombcd.xmd" unprefixed process local integer i initial { 2 } local string s initial { "729.95" } local bcd x set x to i + bcd s output "<$NNZ.ZZ>" % x
If you create your own data types using record
s, you may want to write conversion functions to convert
between those types and other types. In particular it is often useful to convert between user defined types and
string
s. See conversion functions.
Here is a simple hexadecimal dump program that uses some of these conversion methods to print out side-by-side
ASCII and hexadecimal representations of a file. In the ASCII representation, unprintable characters are
represented by periods:
declare #main-input has binary-mode process submit #main-input find any{1 to 16} => chars local integer i repeat scan chars match [" " to "~"]+ => visible output visible match any output "." again output " " ||* 16 - length of chars repeat scan chars match any => char output " " || "16ru2fzd" % binary char increment i output " -" when i = 8 again output "%n"