public static void Main()
var result = AplicarPlantilla("aasssnnnnn", 2020, "DC1", 525);
System.Console.WriteLine(result);
public static String AplicarPlantilla(object sPlantilla, object iEjercicio, object sSerie, object iValor) {
if (iValor == null || iValor == DBNull.Value) return String.Empty;
String plantilla = Convert.ToString(sPlantilla),
ejercicio = Convert.ToInt32(iEjercicio).ToString("0000"),
serie = Convert.ToString(sSerie) + "0000000000",
valor = Convert.ToInt32(iValor).ToString("00000000000000000000");
var iLen = plantilla.Length;
var res = new StringBuilder(32);
case 'a': res.Append(ejercicio.Substring(4 - GetGroupLen(plantilla, iLen, c, ref iAct, 4))); break;
case 'A': res.Append(ejercicio.Substring(4 - GetGroupLen(plantilla, iLen, c, ref iAct, 4))); break;
case 'y': res.Append(ejercicio.Substring(4 - GetGroupLen(plantilla, iLen, c, ref iAct, 4))); break;
case 'Y': res.Append(ejercicio.Substring(4 - GetGroupLen(plantilla, iLen, c, ref iAct, 4))); break;
case 's': res.Append(serie.Substring(0, GetGroupLen(plantilla, iLen, c, ref iAct, 10))); break;
case 'S': res.Append(serie.Substring(0, GetGroupLen(plantilla, iLen, c, ref iAct, 10))); break;
case 'n': res.Append(valor.Substring(20 - GetGroupLen(plantilla, iLen, c, ref iAct, 20))); break;
case 'N': res.Append(valor.Substring(20 - GetGroupLen(plantilla, iLen, c, ref iAct, 20))); break;
case '\\': if (++iAct < iLen) res.Append(plantilla[iAct++]); break;
default: res.Append(c); iAct++; break;
System.Console.WriteLine(String.Format("iAct={0}", iAct));
private static Int32 GetGroupLen(String plantilla, Int32 iLen, Char groupChar, ref Int32 iAct, Int32 maxLen) {
while (++iAct < iLen && (plantilla[iAct] == groupChar)) { }
if ((iAct - iStart) > maxLen) return maxLen;