101 lines
5.6 KiB
Plaintext
101 lines
5.6 KiB
Plaintext
# returns text commatized according to the rules of the task and the #
|
|
# period, location and separator paramters #
|
|
PROC commatize = ( STRING text, INT location, INT period, STRING separator )STRING:
|
|
IF STRING str := text[ AT 1 ];
|
|
# handle the options #
|
|
INT start position := IF location = 0 THEN 1 ELSE location FI;
|
|
INT period length := IF period = 0 THEN 3 ELSE period FI;
|
|
STRING separator string := IF separator = "" THEN "," ELSE separator FI;
|
|
period length < 1 OR start position < 1 OR start position > UPB str
|
|
THEN
|
|
# invalid parameters - return the text unchanged #
|
|
text
|
|
ELIF # attempt to find a non-zero digit #
|
|
INT number pos := start position;
|
|
WHILE IF number pos > UPB str
|
|
THEN FALSE
|
|
ELSE str[ number pos ] < "1" OR str[ number pos ] > "9"
|
|
FI
|
|
DO
|
|
number pos +:= 1
|
|
OD;
|
|
number pos > UPB str
|
|
THEN # no digits in the string - return the text unchanged #
|
|
text
|
|
ELSE # have at least one digit #
|
|
STRING result := str[ 1 : number pos - 1 ];
|
|
# find the final digit #
|
|
INT number end := number pos;
|
|
WHILE IF number end >= UPB str
|
|
THEN FALSE
|
|
ELSE str[ number end + 1 ] >= "0" AND str[ number end + 1 ] <= "9"
|
|
FI
|
|
DO
|
|
number end +:= 1
|
|
OD;
|
|
# copy the digits commatizing as required #
|
|
INT digit count := ( number end - number pos ) + 1;
|
|
WHILE digit count > 1 DO
|
|
result +:= str[ number pos ];
|
|
number pos +:= 1;
|
|
digit count -:= 1;
|
|
IF digit count MOD period length = 0 THEN
|
|
# need a comma after this digit #
|
|
result +:= separator string
|
|
FI
|
|
OD;
|
|
# final digit and the rest of the string #
|
|
result +:= str[ number pos : ];
|
|
result
|
|
FI # commatize # ;
|
|
|
|
# modes and operators to allow us to specify optional parameters to the #
|
|
# commatizing procedure #
|
|
MODE COMMATIZINGOPTIONS = STRUCT( STRING text, INT location, INT period, STRING separator );
|
|
PRIO LOCATION = 9;
|
|
OP LOCATION = ( STRING text, INT location )COMMATIZINGOPTIONS:
|
|
COMMATIZINGOPTIONS( text, location, 0, "" );
|
|
PRIO PERIOD = 9;
|
|
OP PERIOD = ( STRING text, INT period )COMMATIZINGOPTIONS:
|
|
COMMATIZINGOPTIONS( text, 0, period, "" );
|
|
PRIO SEPARATOR = 9;
|
|
OP SEPARATOR = ( STRING text, CHAR separator )COMMATIZINGOPTIONS:
|
|
COMMATIZINGOPTIONS( text, 0, 0, separator );
|
|
OP SEPARATOR = ( STRING text, STRING separator )COMMATIZINGOPTIONS:
|
|
COMMATIZINGOPTIONS( text, 0, 0, separator );
|
|
OP LOCATION = ( COMMATIZINGOPTIONS opts, INT location )COMMATIZINGOPTIONS:
|
|
COMMATIZINGOPTIONS( text OF opts, location, period OF opts, separator OF opts );
|
|
OP PERIOD = ( COMMATIZINGOPTIONS opts, INT period )COMMATIZINGOPTIONS:
|
|
COMMATIZINGOPTIONS( text OF opts, location OF opts, period, separator OF opts );
|
|
OP SEPARATOR = ( COMMATIZINGOPTIONS opts, CHAR separator )COMMATIZINGOPTIONS:
|
|
COMMATIZINGOPTIONS( text OF opts, location OF opts, period OF opts, separator );
|
|
OP SEPARATOR = ( COMMATIZINGOPTIONS opts, STRING separator )COMMATIZINGOPTIONS:
|
|
COMMATIZINGOPTIONS( text OF opts, location OF opts, period OF opts, separator );
|
|
OP COMMATIZE = ( STRING text )STRING: commatize( text, 0, 0, "" );
|
|
OP COMMATIZE = ( COMMATIZINGOPTIONS opts )STRING:
|
|
commatize( text OF opts, location OF opts, period OF opts, separator OF opts );
|
|
|
|
# test the commatization procedure and operators #
|
|
print( ( COMMATIZE( "pi=3.14159265358979323846264338327950288419716939937510582097494459231"
|
|
PERIOD 5 SEPARATOR " " LOCATION 6 ), newline ) );
|
|
print( ( COMMATIZE( "The author has two Z$100000000000000 Zimbabwe notes (100 trillion)."
|
|
SEPARATOR "." ), newline ) );
|
|
print( ( COMMATIZE( "The author has two Z$100000000000000 Zimbabwe notes (100 trillion)."
|
|
SEPARATOR "." PERIOD 6 ), newline ) );
|
|
print( ( COMMATIZE( "The author has two Z$100000000000000 Zimbabwe notes (100 trillion)."
|
|
SEPARATOR "__" ), newline ) );
|
|
print( ( COMMATIZE( "The author has two Z$100000000000000 Zimbabwe notes (100 trillion)."
|
|
LOCATION 26 PERIOD 1 SEPARATOR "::" ), newline ) );
|
|
print( ( COMMATIZE """-in Aus$+1411.8millions""", newline ) );
|
|
print( ( COMMATIZE "===US$0017440 millions=== (in 2000 dollars)", newline ) );
|
|
print( ( COMMATIZE "123.e8000 is pretty big.", newline ) );
|
|
print( ( COMMATIZE "The land area of the earth is 57268900(29% of the surface) square miles.", newline ) );
|
|
print( ( COMMATIZE "Ain't no numbers in this here words, nohow, no way, Jose.", newline ) );
|
|
print( ( COMMATIZE "James was never known as 0000000007", newline ) );
|
|
print( ( COMMATIZE ( "Arthur Eddington wrote: I believe there are "
|
|
+ "15747724136275002577605653961181555468044717914527116709366231425076185631031296 "
|
|
+ "protons in the universe."
|
|
), newline ) );
|
|
print( ( COMMATIZE " $-140000±100 millions.", newline ) );
|
|
print( ( COMMATIZE "6/9/1946 was a good year for some.", newline ) )
|