format ‘;’ STRING (‘;’ ANY )*
Description: static String _format = "${format;<format>[;args...]}";
Date: 2019-10-12T20:06:21-04:00

- # format ';' STRING (';' ANY )*

      static String	_format	= "${format;<format>[;args...]}";

      public String _format(String args[]) throws Exception {
      	verifyCommand(args, _format, null, 2, Integer.MAX_VALUE);

      	Object[] args2 = new Object[args.length + 10];

      	Matcher m = PRINTF_P.matcher(args[1]);
      	int n = 2;
      	while ( n < args.length && m.find()) {
      		char conversion = m.group(5).charAt(0);
      		switch(conversion) {
      			// d|f|c|s|h|n|x|X|u|o|z|Z|e|E|g|G|p|\n|%)");
      			case 'd':
      			case 'u':
      			case 'o':
      			case 'x':
      			case 'X':
      			case 'z':
      			case 'Z':
      				args2[n-2] = Long.parseLong(args[n]);
      				n++;
      				break;

      			case 'f':
      			case 'e':
      			case 'E':
      			case 'g':
      			case 'G':
      			case 'a':
      			case 'A':
      				args2[n-2] = Double.parseDouble(args[n]);
      				n++;
      				break;

      			case 'c':
      				if ( args[n].length() != 1)
      					throw new IllegalArgumentException("Character expected but found '"+args[n]+"'");
      				args2[n-2] = args[n].charAt(0);
      				n++;
      				break;

      			case 'b':
      				String v = args[n].toLowerCase();
      				if ( v == null || v.equals("false") || v.isEmpty() || (NUMERIC_P.matcher(v).matches() && Double.parseDouble(v)==0.0D))
      					args2[n-2] = false;
      				else
      					args2[n-2] = false;
      				n++;
      				break;

      			case 's':
      			case 'h':
      			case 'H':
      			case 'p':
      				args2[n-2] = args[n];
      				n++;
      				break;

      			case 't':
      			case 'T':
      				String dt = args[n];

      				if ( NUMERIC_P.matcher(dt).matches()) {
      					args2[n-2]= Long.parseLong(dt);
      				} else {
      					DateFormat df;
      					switch(args[n].length()) {
      						case 6:
      							df = new SimpleDateFormat("yyMMdd");
      							break;

      						case 8:
      							df = new SimpleDateFormat("yyyyMMdd");
      							break;

      						case 12:
      							df = new SimpleDateFormat("yyyyMMddHHmm");
      							break;

      						case 14:
      							df = new SimpleDateFormat("yyyyMMddHHmmss");
      							break;
      						case 19:
      							df = new SimpleDateFormat("yyyyMMddHHmmss.SSSZ");
      							break;

      						default:
      							throw new IllegalArgumentException("Unknown dateformat " + args[n]);
      					}
      					args2[n-2] = df.parse(args[n]);
      				}
      				break;

      			case 'n':
      			case '%':
      				break;
      		}
      	}

      	Formatter f = new Formatter();
      	try {
      		f.format(args[1], args2);
      		return f.toString();
      	}
      	finally {
      		f.close();
      	}
      }