1 package com.sharkysoft.printf; 2 3 import com.sharkysoft.printf.engine.StringFormatter; 4 5 final class Formatter_s extends Formatter_Field 6 { 7 8 final int mnPrecision; 9 10 Formatter_s(final FormatSpecifier ipPfs) 11 { 12 super(ipPfs, new StringFormatter()); 13 mnPrecision = ipPfs.mnPrecision; 14 } 15 16 void format(final PrintfState ipPs) 17 { 18 adjustWidth(ipPs); 19 int vnPrec = mnPrecision; 20 if (vnPrec == FormatSpecifier.PRECISION_ARGUMENT) 21 { 22 vnPrec = ((Number) ipPs.mapArgs[ipPs.mnArgIndex++]).intValue(); 23 if (vnPrec < 0) 24 throw new PrintfTemplateException("variable precision=" + mnPrecision); 25 } 26 final Object vpO = ipPs.mapArgs[ipPs.mnArgIndex++]; 27 String vsS; 28 if (vpO != null) 29 vsS = vpO.toString(); 30 else 31 vsS = "null"; 32 if (vnPrec >= 0) 33 { 34 if (vsS.length() > vnPrec) 35 vsS = vsS.substring(0, mnPrecision); 36 } 37 ipPs.mpOutput.append(mpFormatter.format(vsS)); 38 } 39 40 final int argsRequired() 41 { 42 return 1 43 + (mnPrecision == FormatSpecifier.PRECISION_ARGUMENT ? 1 : 0) 44 + (mzVariableWidth ? 1 : 0); 45 } 46 47 Class[] argTypes() { 48 if (mzVariableWidth && mnPrecision == FormatSpecifier.PRECISION_ARGUMENT) { 49 return new Class[] { Number.class, Number.class, Object.class }; 50 } else if (!mzVariableWidth && mnPrecision != FormatSpecifier.PRECISION_ARGUMENT) { 51 return new Class[] { Object.class }; 52 } else { 53 return new Class[] { Number.class, Object.class }; 54 } 55 } 56 57 } 58