Quick guide to F$FAO()

From VSI OpenVMS Wiki
Revision as of 09:58, 22 August 2018 by Darya.zelenina (talk | contribs) (Created page with "'''F$FAO()''' can be used to create good-looking formatted output including tables, dividers, numeric conversion, and more. The full list of F$FAO() control strings can be fou...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

F$FAO() can be used to create good-looking formatted output including tables, dividers, numeric conversion, and more. The full list of F$FAO() control strings can be found in the main article.

Choosing a control string

You need to insert... Directive to use Example Result
a string !AS f$fao("Welcome back, !AS","John") Welcome back, John
a singular/plural (more below !%S f$fao("I have !ZL apple!%S",5")
f$fao("I have !ZL apple!%S",1")
I have 5 apples
I have 1 apple
a number !SL f$fao("!SL",-112) -112
the current time !%T f$fao("It's !%T now",0) It's 12:14:55.90 now
the current date/time !%D f$fao("It's !%D now",0) It's 16-AUG-2018 12:15:02.28 now
a new line !/ f$fao("hello !/ goodbye")
$ write sys$output f$fao("hello !/goodbye")<br>hello<br>goodbye
a line of dashes/asterisks !n*- f$fao("!25*-!/") -------------------------
put it in a field !nDD f$fao("Total: !20SL",73)
Total:                   73
  • To insert an actual exclamation point, use two exclamation points:
$ write sys$output f$fao("Hello!!")
Hello!
  • Watch your argument types. If you use a wrong type of argument, such as an integer for !AS, you will get %SYSTEM-F-ACCVIO, access violation message.

Dealing with plurals

There is a special directive for English plurals (that are normally just -s): !%S. It inserts an "s" if the most recently converted number is not 1:

$ write sys$output f$fao("I have !SL apple!%S",5)
I have 5 apples
$ write sys$output f$fao("I have !SL apple!%S",1)
I have 1 apple

There is also a different directive that lets you use other endings. For example, if you have the word "child", the regular "s" will not work there. Here's what you can use:

  • !n%Cyour_ending inserts a character string (your_ending) when the most recently evaluated argument has the value n
  • !%Eyour_ending inserts a character string (your_ending) when the most recently evaluated argument does not match any of the preceding !n%C directives.
  • When you are done defining the forms of that single word, use the !%F directive to mark the end of the plurals statement.**

So, for the case with child, you need the system to use no ending if the number is 1 and the ending "ren" if the number is anything but one:

$ write sys$output f$fao("I have !SL child!1%C !%Eren !%F",1)
I have 1 child
$ write sys$output f$fao("I have !SL child!1%C !%Eren !%F",5)
I have 5 children

Another example is offered by the online help on F$FAO:

REPORT = F$FAO("There !0UL!1%Cis!%Eare!%F !-!UL !-!0UL!1%Cchild!%Echildren!%F here",OFFSPRING)

Here's how this works for languages with multiple number forms. For example, let's count cats in Polish:

$ write sys$output f$fao("!SB kot!1%C !2%Cy !3%Cy !4%Cy !%Eow !%F",1)
1 kot
$ write sys$output f$fao("!SB kot!1%C !2%Cy !3%Cy !4%Cy !%Eow !%F",2)
2 koty
$ write sys$output f$fao("!SB kot!1%C !2%Cy !3%Cy !4%Cy !%Eow !%F",3)
3 koty
$ write sys$output f$fao("!SB kot!1%C !2%Cy !3%Cy !4%Cy !%Eow !%F",4)
4 koty
$ write sys$output f$fao("!SB kot!1%C !2%Cy !3%Cy !4%Cy !%Eow !%F",5)
5 kotow
$ write sys$output f$fao("!SB kot!1%C !2%Cy !3%Cy !4%Cy !%Eow !%F",6)
6 kotow
$ write sys$output f$fao("!SB kot!1%C !2%Cy !3%Cy !4%Cy !%Eow !%F",7)
7 kotow