<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>El blog de Jesús Velasco</title><link>http://geeks.ms/blogs/jvelasco/default.aspx</link><description>O lo que es lo mismo: alskare&amp;#39;s blog</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>ASP.Net Enviar correo electrónico con ficheros adjuntos</title><link>http://geeks.ms/blogs/jvelasco/archive/2012/01/03/asp-net-enviar-correo-electr-243-nico-con-ficheros-adjuntos.aspx</link><pubDate>Tue, 03 Jan 2012 13:16:26 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202585</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=202585</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2012/01/03/asp-net-enviar-correo-electr-243-nico-con-ficheros-adjuntos.aspx#comments</comments><description>Otra de las preguntas bastante frecuente por los foros de Microsoft es la posibilidad de enviar un correo electrónico desde una página pero que contenga uno o varios ficheros adjuntos. Aunque en una búsqueda genérica nos aparecen miles de entradas sobre el tema, intentaremos, en esta ocasión, crear un ejemplo lo más sencillo posible. El envío de un correo electrónico es relativamente sencillo, sobre todo, si nos abstraemos de la configuración del correo y dejamos los datos en el archivo web.config...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2012/01/03/asp-net-enviar-correo-electr-243-nico-con-ficheros-adjuntos.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202585" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Ejemplos/default.aspx">Ejemplos</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/ASP.Net/default.aspx">ASP.Net</category></item><item><title>C# Encuadrar una imagen mediante GDI+</title><link>http://geeks.ms/blogs/jvelasco/archive/2012/01/02/c-encuadrar-una-imagen-mediante-gdi.aspx</link><pubDate>Mon, 02 Jan 2012 12:44:21 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202549</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=202549</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2012/01/02/c-encuadrar-una-imagen-mediante-gdi.aspx#comments</comments><description>En los foros de MSDN es frecuente leer alguna pregunta de cómo se puede encuadrar una fotografía para poder adaptarla a un determinado tamaño. A menudo las respuestas se enfocan al entorno de desarrollo, así por ejemplo, en el caso de ser en el foro de ASP.Net, la respuesta comúnmente se enfoca a la creación de un DIV que permita simular el cuadro externo, en caso de WinForms, un panel que recubra la imagen… No obstante, cuando tratamos de hacer algo así, casi siempre nos encontramos con problemas...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2012/01/02/c-encuadrar-una-imagen-mediante-gdi.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202549" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Utiles/default.aspx">Utiles</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/ASP.Net/default.aspx">ASP.Net</category></item><item><title>SSMS: No se permite guardar los cambios</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/12/26/ssms-no-se-permite-guardar-los-cambios.aspx</link><pubDate>Mon, 26 Dec 2011 20:28:44 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202326</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=202326</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/12/26/ssms-no-se-permite-guardar-los-cambios.aspx#comments</comments><description>Igual el post actual causa algún tipo de controversia entre los DBA, y no existe nada más lejos de mi intención. Para un desarrollador como yo, si intentas hacer un cambio en una tabla de SQL Server (actualmente estoy con la versión 2008 R2) y el entorno te da un problema diciendo que no puedes hacerlo, realmente es un fastidio. Jesús, ¿de qué estás hablando?. Pues realmente es algo que es muy sencillo, pero que es bastante molesto cuando intentas evitarte problemas a la hora de desarrollar. Pongamos...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/12/26/ssms-no-se-permite-guardar-los-cambios.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202326" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/SQL+Server/default.aspx">SQL Server</category></item><item><title>Leer variables Session desde una capa de Negocios</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/09/11/leer-variables-session-desde-una-capa-de-negocios.aspx</link><pubDate>Sun, 11 Sep 2011 17:46:42 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200433</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=200433</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/09/11/leer-variables-session-desde-una-capa-de-negocios.aspx#comments</comments><description>En una reciente conversación en los foros de ms, desempolvé una vieja utilidad que en más de una ocasión me ha salvado de un apuro y que, aunque no tenía en el olvido, reconozco que no le di la importancia que tenía hasta que comprendí que mucha gente tiene los mismos problemas que tengo yo. Al fin y al cabo siempre pienso que soy más torpe que los demás y que lo que a mí me cuesta mucho rato desarrollar, el resto lo resuelven a la primera. Bueno, intento comentarlo con un ejemplo, que siempre es...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/09/11/leer-variables-session-desde-una-capa-de-negocios.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200433" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/ASP.Net/default.aspx">ASP.Net</category></item><item><title>Internacionalizar las fechas (o parte de ellas)</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/08/10/internacionalizar-las-fechas-o-parte-de-ellas.aspx</link><pubDate>Wed, 10 Aug 2011 10:01:06 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:199091</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=199091</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/08/10/internacionalizar-las-fechas-o-parte-de-ellas.aspx#comments</comments><description>Nunca dejará de sorprenderme la librería de clases del .Net Framework. Ahora que andamos liados con el tema de internacionalización de un par de aplicaciones se nos presentaba la problemática de tener que mostrar, en algún momento, algún que otro control en el que se tiene que, por ejemplo, rellenar un combo con los meses del año en el idioma del usuario. Comúnmente, cuando he hecho esto con anterioridad siempre me he creado algún que otro método en la capa de negocios que devolviese los meses, los...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/08/10/internacionalizar-las-fechas-o-parte-de-ellas.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=199091" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/.Net/default.aspx">.Net</category></item><item><title>C#. Unidades de capacidad</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/07/19/c-unidades-de-capacidad.aspx</link><pubDate>Tue, 19 Jul 2011 17:24:15 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:198033</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=198033</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/07/19/c-unidades-de-capacidad.aspx#comments</comments><description>No será la primera vez que hemos creado algún sistema de visualización de archivos y, casi siempre solemos poner lo mismo, es decir, un grid en el que aparecen datos como Nombre, Extensión, Tamaño… Hoy me he fijado en el tamaño. La magnífica clase System.IO.FileInfo nos proporciona casi todos los elementos a los que solemos hacer referencia cuando trabajamos con algún que otro archivo. Las propiedades Name, FullName, Extension y Length quizás sean los elementos más socorridos a la hora de mostrar...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/07/19/c-unidades-de-capacidad.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=198033" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/.Net/default.aspx">.Net</category></item><item><title>LastUpdateUser y LastUpdateDate en capa de negocios</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/07/13/lastupdateuser-y-lastupdatedate-en-capa-de-negocios.aspx</link><pubDate>Wed, 13 Jul 2011 20:21:22 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:197718</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=197718</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/07/13/lastupdateuser-y-lastupdatedate-en-capa-de-negocios.aspx#comments</comments><description>Desde los primeros programitas que desarrollé, algo que me ha gustado tener y que, en más de una ocasión me ha servido para descubrir algún que otro problemilla ha sido guardar en las tablas de la base de datos los campos LastUpdateUser y LastUpdateDate con la finalidad de almacenar el usuario y la fecha de la última modificación. Este proceso, ya desde los tiempos de VB5 era un proceso bastante sencillo desde cualquier apartado de la aplicación, fuese un fichero .EXE o una .DLL. En principio, si...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/07/13/lastupdateuser-y-lastupdatedate-en-capa-de-negocios.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=197718" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/.Net/default.aspx">.Net</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/ASP.Net/default.aspx">ASP.Net</category></item><item><title>C#. NombrePropio</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/07/02/c-nombrepropio.aspx</link><pubDate>Sat, 02 Jul 2011 12:31:33 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:197063</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=197063</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/07/02/c-nombrepropio.aspx#comments</comments><description>Lamento tener tan abandonado el blog pero es que ando inmerso en un proyecto de aquellos que te absorben mucho más tiempo del que te gustaría. Intentaremos sacar algo de tiempo ahora que, por lo menos ya no tengo clases. Bueno, hoy le toca el turno a una de aquellas pequeñas cosas a las que, los que vais siguiendo el blog ya estáis acostumbrados. El caso es que el otro día, charlando con el jefe me comenta lo mal que queda que los clientes vean los datos unos en mayúscula, otros en formato Título...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/07/02/c-nombrepropio.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=197063" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Utiles/default.aspx">Utiles</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Generar fechas aleatorias con C#</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/05/18/generar-fechas-aleatorias-con-c.aspx</link><pubDate>Wed, 18 May 2011 18:41:28 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:194525</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=194525</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/05/18/generar-fechas-aleatorias-con-c.aspx#comments</comments><description>En los cursos suelo utilizar datos casi siempre aleatorios y, últimamente me ha dado por hacer los ficheros con C#. Hasta aquí, bien, pero me pasó una cosa curiosa ayer. El caso es que necesitaba crear un par de columnas con una serie de fechas aleatorias y, de buenas a primeras me quedé delante del ordenador, pensando. Me quedé en blanco porque, sencillamente, no se me ocurrían más que cosas en las que seguro que me tiraba un buen rato para una tontería como esta. Obtener un año aleatorio, calcular...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/05/18/generar-fechas-aleatorias-con-c.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=194525" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Utiles/default.aspx">Utiles</category></item><item><title>Modificar valores de las propiedades de una clase</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/04/27/modificar-valores-de-las-propiedades-de-una-clase.aspx</link><pubDate>Wed, 27 Apr 2011 18:02:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:193089</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=193089</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/04/27/modificar-valores-de-las-propiedades-de-una-clase.aspx#comments</comments><description>Estoy m&amp;aacute;s que seguro que el post actual es una de aquellas cosas que casi todo el mundo conoc&amp;iacute;a, pero a m&amp;iacute; me ha dado una especie de subid&amp;oacute;n el descubrirlo. Explico el problema. En un programa que estoy haciendo me he encontrado en la situaci&amp;oacute;n de que tengo que importar unos datos que vienen de una serie de proveedores. Hasta aqu&amp;iacute; ha sido un poco aburrido puesto que unos lo env&amp;iacute;an en formato .txt, otros en Access y, por supuesto, cada uno con su formato...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/04/27/modificar-valores-de-las-propiedades-de-una-clase.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=193089" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/.Net/default.aspx">.Net</category></item><item><title>Outlook 2010. El tamaño de los datos adjuntos excede el límite permitido</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/03/27/outlook-2010-el-tama-241-o-de-los-datos-adjuntos-excede-el-l-237-mite-permitido.aspx</link><pubDate>Sun, 27 Mar 2011 17:06:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:191143</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=191143</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/03/27/outlook-2010-el-tama-241-o-de-los-datos-adjuntos-excede-el-l-237-mite-permitido.aspx#comments</comments><description>Sé que no es un post de programación, pero me ha tenido un rato entretenido y he considerado oportuno comentarlo. Así, por un lado, si alguien puede aprovecharlo, bien y si no, seguro que me sirve de recordatorio cuando tenga que volver a utilizarlo. El caso es que necesitaba enviar un fichero por correo electrónico que ocupaba la friolera de 30 Mb. Hasta el momento, tanto mi servidor de correo como el de la persona a la que se lo enviaba aceptan tales tamaños pero esta vez la limitación no ha venido...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/03/27/outlook-2010-el-tama-241-o-de-los-datos-adjuntos-excede-el-l-237-mite-permitido.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191143" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Office/default.aspx">Office</category></item><item><title>Codificación Unicode</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/03/10/codificaci-243-n-unicode.aspx</link><pubDate>Thu, 10 Mar 2011 19:04:49 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:190211</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=190211</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/03/10/codificaci-243-n-unicode.aspx#comments</comments><description>Ya que tengo alguna que otra primavera a cuestas y que suelo ganarme la vida, entre otras cosas, impartiendo clases, reconozco que tengo alguna que otra manía. Una de estas manías está estrechamente ligada con la ortografía (u hortografía, como vi no hace mucho en el escrito de un alumno). Hace poco, en la creación de una página web, el cliente solicitó uno de aquellos enlaces que, al hacer un clic sobre él, se abriera el cliente de correo. Para la mayor parte de clientes, sólo existe el Outlook...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/03/10/codificaci-243-n-unicode.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=190211" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Utiles/default.aspx">Utiles</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/.Net/default.aspx">.Net</category></item><item><title>C#: Nombre de fichero aleatorio</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/02/22/c-nombre-de-fichero-aleatorio.aspx</link><pubDate>Mon, 21 Feb 2011 23:20:47 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:189365</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=189365</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/02/22/c-nombre-de-fichero-aleatorio.aspx#comments</comments><description>Cuando escribes un post y tienes la responsabilidad de hacerlo en un lugar como puede ser geeks.ms, intentas que tenga un mínimo de calidad. En este caso sé que no es así, aunque no puedo evitar hacerlo, puesto que es un tema que me ha tocado las narices más de una vez. En más de una ocasión me he encontrado con la necesidad de tener que tocar un fichero temporal, tanto en WinForms como en WebForms para, por ejemplo, descomprimir un fichero, tratar un documento en la web para descargarlo posteriormente...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/02/22/c-nombre-de-fichero-aleatorio.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=189365" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/.Net/default.aspx">.Net</category></item><item><title>C#: Calcular Semana Santa</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/02/14/c-calcular-semana-santa.aspx</link><pubDate>Mon, 14 Feb 2011 19:54:36 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:188966</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=188966</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/02/14/c-calcular-semana-santa.aspx#comments</comments><description>Siempre he pensado que todo programador, de vez en cuando necesitamos alguna ida de olla y, sencillamente, nos sentamos delante del ordenador más por entretenimiento que por necesidad. En mi caso por lo menos, cuando ando muy agobiado con el resto del entorno, es algo que me libera bastante. Claro, que suele liberarme mucho más salir a tomar unas cuantas cervezas con los amiguetes, pero como en este caso no tenía ganas de estar resacoso a la mañana siguiente, pues opté por hacer algo que me entretuviese...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/02/14/c-calcular-semana-santa.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=188966" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Ejemplos/default.aspx">Ejemplos</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/WebForms/default.aspx">WebForms</category></item><item><title>Validar un número de cuenta bancaria</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/02/05/validar-un-n-250-mero-de-cuenta-bancaria.aspx</link><pubDate>Sat, 05 Feb 2011 16:17:26 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:188443</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=188443</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/02/05/validar-un-n-250-mero-de-cuenta-bancaria.aspx#comments</comments><description>En el blog anterior tenía una serie de utilidades que intentaré revisar y traspasar al actual. En esta ocasión le ha tocado el turno a un clásico: la validación de un número de cuenta bancaria: using System; using System.Text.RegularExpressions; namespace JnSoftware.Validaciones { /// &amp;lt;summary&amp;gt; /// Servicios de validación de las cuentas bancarias españolas /// &amp;lt;/summary&amp;gt; public static class CuentasBancarias { /// &amp;lt;summary&amp;gt; /// Validación de una cuenta bancaria española /// &amp;lt;...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/02/05/validar-un-n-250-mero-de-cuenta-bancaria.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=188443" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Utiles/default.aspx">Utiles</category></item><item><title>C#: Implementar la Interface ICloneable</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/01/23/c-implementar-la-interface-icloneable.aspx</link><pubDate>Sun, 23 Jan 2011 19:51:02 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:187802</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=187802</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/01/23/c-implementar-la-interface-icloneable.aspx#comments</comments><description>No será la primera vez que me he encontrado en la tesitura de tener que duplicar todos los datos de una clase. Quizás, el ejemplo más claro lo encontremos cuando tenemos un grid creado y el usuario te sugiere la posibilidad de crear una nueva función que permita copiar una fila ya existente, con todos sus datos. De esta manera, modificando sólo los datos que varían, la creación de la nueva fila es mucho más sencilla. Reconozco que en alguna ocasión he llegado a implementar la Interface ICloneable...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/01/23/c-implementar-la-interface-icloneable.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=187802" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/.Net/default.aspx">.Net</category></item><item><title>ASP.Net: Crear un control de servidor. Ejemplo: JnTextBoxNif</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/01/11/asp-net-crear-un-control-de-servidor-ejemplo-jntextboxnif.aspx</link><pubDate>Tue, 11 Jan 2011 12:28:15 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:187108</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=187108</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/01/11/asp-net-crear-un-control-de-servidor-ejemplo-jntextboxnif.aspx#comments</comments><description>En el post anterior, Validar CIF, NIF, NIE me comprometí a explicar cómo hacer uso de la clase JnSoftware.Validaciones.NumeroNif para validar un documento introducido en una página ASP.NET. Debo confesar que el motivo inicial era crear un control de usuario en el que se validase dicho documento embebido dentro de un UpdatePanel. Como hasta el momento no había creado nunca un control de servidor, reconozco que ha podido más la curiosidad que otra cosa y al final, después de algún que otro problema...(&lt;a href="http://geeks.ms/blogs/jvelasco/archive/2011/01/11/asp-net-crear-un-control-de-servidor-ejemplo-jntextboxnif.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=187108" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/WebForms/default.aspx">WebForms</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Utiles/default.aspx">Utiles</category></item><item><title>C#. Validar CIF, NIF, NIE</title><link>http://geeks.ms/blogs/jvelasco/archive/2011/01/03/c-validar-cif-nif-nie.aspx</link><pubDate>Mon, 03 Jan 2011 20:09:56 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:186715</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=186715</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2011/01/03/c-validar-cif-nif-nie.aspx#comments</comments><description>&lt;p&gt;Imagino que, al igual que todos los que alguna vez hemos empezado en esto del desarrollo de aplicaciones, nuestro ego nos ha jugado alguna que otra mala pasada. Ya desde mis inicios de la mano de Access o de Visual Basic 3.0, veía con bastante desgana cómo se iban introduciendo CIFs del tipo A00000000 o A-00000000, o A-00.000.000; matrículas con formatos dispares: GGG0000 ó 0000GGG. Comento y quizás resalto “desgana”, puesto que es uno de los puntos menos valorados tanto por desarrolladores como por clientes. &lt;em&gt;Si total, sólo vale para perder el tiempo y retrasar la finalización del programa&lt;/em&gt;. Claro, que el problema nos lo encontramos nosotros cuando llega el momento de obtener un listado ordenado o una simple búsqueda. No recuerdo si fue la versión 5 de VB la que ya incluía la posibilidad de crear OCX que, entre otras cosas, permitía separar un conjunto de controles con el objetivo de reutilizarlos del código de la aplicación. &lt;/p&gt;  &lt;p&gt;El caso es que he tenido miles de peleas con los datos cuando éstos no estaban normalizados, así que un día me levanté y me puse manos a la obra con la finalidad de intentar homologar todos aquellos datos que sean susceptibles de tener un “formato igual”. En el &lt;a href="http://alskare.wordpress.com/" target="_blank"&gt;blog anterior&lt;/a&gt; ya quedó alguno de estos intentos. Una de las &lt;a href="http://alskare.wordpress.com/2009/07/21/validar-nif-nie-cif/" target="_blank"&gt;rutinas&lt;/a&gt; que más me costó en su día fue el intento de poder validar, en un mismo campo, un CIF de empresa, un NIF de persona física y el Número de Identificación de Extranjería (NIE), sin tener que indicarle previamente el tipo de documento. &lt;/p&gt;  &lt;p&gt;Como suele pasar cada vez que se empieza un nuevo proyecto, el primer boceto contenía múltiples errores. Algunos de ellos se fueron subsanando; otros, quizás por la falta de tiempo habitual, no quedaron pulidos del todo. Así, aprovechando el haber tenido un poco de tiempo estas fiestas, he intentado pulir el código, de tal manera que sea útil para cualquiera que lo precise.&lt;/p&gt;  &lt;p&gt;Uno de los errores que tenía era la eliminación, en la normalización, de aquellos números que empezaban por 0 y la asignación de algún NIE cuando realmente no lo era. Lo único que he omitido de los comentarios que me hicieron en su día es un tema sobre el que anduve buscando información y no supe encontrar una solución bien documentada: &lt;em&gt;los NIE están formados por una letra, ocho dígitos numéricos y el dígito de control&lt;/em&gt;. En su lugar, he optado por tomar la definición y la normativa publicada en &lt;a href="http://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_fiscal" target="_blank"&gt;Wikipedia&lt;/a&gt; a tal respecto.&lt;/p&gt;  &lt;p&gt;Dejo el código tal cuál ha quedado ya reformado:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Text.RegularExpressions;

&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;
&lt;span style="color:#008000;"&gt; * NumeroNif.cs&lt;/span&gt;
&lt;span style="color:#008000;"&gt; * Servicios de validación de los números NIF&lt;/span&gt;
&lt;span style="color:#008000;"&gt; * &lt;/span&gt;
&lt;span style="color:#008000;"&gt; * älskare, Ene/11&lt;/span&gt;
&lt;span style="color:#008000;"&gt; */&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; JnSoftware.Validaciones
{

    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Representa un número. En la clase se desglosan las distintas opciones que se puedan&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// encontrar&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; NumeroNif
    {
        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Tipos de Códigos.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;Aunque actualmente no se utilice el término CIF, se usa en la enumeración&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// por comodidad&amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt; TiposCodigosEnum { NIF, NIE, CIF }

        &lt;span style="color:#008000;"&gt;// Número tal cual lo introduce el usuario&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; numero;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; TiposCodigosEnum tipo;

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Parte de Nif: En caso de ser un Nif intracomunitario, permite obtener el cógido del país&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; CodigoIntracomunitario { get; &lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; set; }
        &lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; EsIntraComunitario { get; set; }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Parte de Nif: Letra inicial del Nif, en caso de tenerla&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; LetraInicial { get; &lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; set; }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Parte de Nif: Bloque numérico del NIF. En el caso de un NIF de persona física,&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// corresponderá al DNI&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Numero { get; &lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; set; }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Parte de Nif: Dígito de control. Puede ser número o letra&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; DigitoControl { get; &lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; set; }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Valor que representa si el Nif introducido es correcto&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; EsCorrecto { get; &lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; set; }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Cadena que representa el tipo de Nif comprobado:&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;///     - NIF : Número de identificación fiscal de persona física&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;///     - NIE : Número de identificación fiscal extranjería&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;///     - CIF : Código de identificación fiscal (Entidad jurídica)&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; TipoNif { get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; tipo.ToString(); } }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Constructor. Al instanciar la clase se realizan todos los cálculos&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;numero&amp;quot;&amp;gt;Cadena de 9 u 11 caracteres que contiene el DNI/NIF&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// tal cual lo ha introducido el usuario para su verificación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; NumeroNif(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; numero)
        {
            &lt;span style="color:#008000;"&gt;// Se eliminan los carácteres sobrantes&lt;/span&gt;
            numero = EliminaCaracteres(numero);

            &lt;span style="color:#008000;"&gt;// Todo en maýusculas&lt;/span&gt;
            numero = numero.ToUpper();

            &lt;span style="color:#008000;"&gt;// Comprobación básica de la cadena introducida por el usuario&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (numero.Length != 9 &amp;amp;&amp;amp; numero.Length != 11)
                &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentException(&lt;span style="color:#006080;"&gt;&amp;quot;El NIF no tiene un número de caracteres válidos&amp;quot;&lt;/span&gt;);
           
            &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.numero = numero;
            Desglosa();

            &lt;span style="color:#0000ff;"&gt;switch&lt;/span&gt; (tipo)
            {
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; TiposCodigosEnum.NIF:
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; TiposCodigosEnum.NIE:
                    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.EsCorrecto = CompruebaNif();
                    &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; TiposCodigosEnum.CIF:
                    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.EsCorrecto = CompruebaCif();
                    &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;
            }
        }

        &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; Preparación del número (desglose)

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Realiza un desglose del número introducido por el usuario en las propiedades&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// de la clase&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Desglosa()
        {
            Int32 n;
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (numero.Length == 11)
            {
                &lt;span style="color:#008000;"&gt;// Nif Intracomunitario&lt;/span&gt;
                EsIntraComunitario = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
                CodigoIntracomunitario = numero.Substring(0, 2);
                LetraInicial = numero.Substring(2, 1);
                Int32.TryParse(numero.Substring(3, 7), &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; n);
                DigitoControl = numero.Substring(10, 1);
                tipo = GetTipoDocumento(LetraInicial[0]);
            }
            &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
            {
                &lt;span style="color:#008000;"&gt;// Nif español&lt;/span&gt;
                tipo = GetTipoDocumento(numero[0]);
                EsIntraComunitario = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;
                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (tipo == TiposCodigosEnum.NIF)
                {
                    LetraInicial = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;
                    Int32.TryParse(numero.Substring(0, 8), &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; n);
                }
                &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
                {
                    LetraInicial = numero.Substring(0, 1);
                    Int32.TryParse(numero.Substring(1, 7), &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt;  n);
                }
                DigitoControl = numero.Substring(8, 1);
            }
            Numero = n;
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// En base al primer carácter del código, se obtiene el tipo de documento que se intenta&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// comprobar&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;letra&amp;quot;&amp;gt;Primer carácter del número pasado&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Tipo de documento&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; TiposCodigosEnum GetTipoDocumento(&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; letra)
        {
            Regex regexNumeros = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color:#006080;"&gt;&amp;quot;[0-9]&amp;quot;&lt;/span&gt;);
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (regexNumeros.IsMatch(letra.ToString()))
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; TiposCodigosEnum.NIF;

            Regex regexLetrasNIE = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color:#006080;"&gt;&amp;quot;[XYZ]&amp;quot;&lt;/span&gt;);
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (regexLetrasNIE.IsMatch(letra.ToString()))
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; TiposCodigosEnum.NIE;

            Regex regexLetrasCIF = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color:#006080;"&gt;&amp;quot;[ABCDEFGHJPQRSUVNW]&amp;quot;&lt;/span&gt;);
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (regexLetrasCIF.IsMatch(letra.ToString()))
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; TiposCodigosEnum.CIF;

            &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ApplicationException(&lt;span style="color:#006080;"&gt;&amp;quot;El código no es reconocible&amp;quot;&lt;/span&gt;);
        }



        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Eliminación de todos los carácteres no numéricos o de texto de la cadena&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;numero&amp;quot;&amp;gt;Número tal cual lo escribe el usuario&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena de 9 u 11 carácteres sin signos&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; EliminaCaracteres(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; numero)
        {
            &lt;span style="color:#008000;"&gt;// Todos los carácteres que no sean números o letras&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; caracteres = &lt;span style="color:#006080;"&gt;@&amp;quot;[^\w]&amp;quot;&lt;/span&gt;;
            Regex regex = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Regex(caracteres);
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; regex.Replace(numero, &lt;span style="color:#006080;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);
        }

        &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;

        &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; Cálculos

        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; CompruebaNif()
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; DigitoControl == GetLetraNif();
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Cálculos para la comprobación del Cif (Entidad jurídica)&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; CompruebaCif()
        {
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] letrasCodigo = { &lt;span style="color:#006080;"&gt;&amp;quot;J&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;E&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;F&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;G&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;H&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;I&amp;quot;&lt;/span&gt; };

            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; n = Numero.ToString(&lt;span style="color:#006080;"&gt;&amp;quot;0000000&amp;quot;&lt;/span&gt;);
            Int32 sumaPares = 0;
            Int32 sumaImpares = 0;
            Int32 sumaTotal = 0;
            Int32 i = 0;
            &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; retVal = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;

            &lt;span style="color:#008000;"&gt;// Recorrido por todos los dígitos del número&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (i = 0; i &amp;lt; n.Length; i++)
            {
                Int32 aux;
                Int32.TryParse(n[i].ToString(), &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; aux);

                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((i + 1) % 2 == 0)
                {
                    &lt;span style="color:#008000;"&gt;// Si es una posición par, se suman los dígitos&lt;/span&gt;
                    sumaPares += aux;
                }
                &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
                {
                    &lt;span style="color:#008000;"&gt;// Si es una posición impar, se multiplican los dígitos por 2 &lt;/span&gt;
                    aux = aux * 2;

                    &lt;span style="color:#008000;"&gt;// se suman los dígitos de la suma&lt;/span&gt;
                    sumaImpares += SumaDigitos(aux);
                }
            }
            &lt;span style="color:#008000;"&gt;// Se suman los resultados de los números pares e impares&lt;/span&gt;
            sumaTotal += sumaPares + sumaImpares;

            &lt;span style="color:#008000;"&gt;// Se obtiene el dígito de las unidades&lt;/span&gt;
            Int32 unidades = sumaTotal % 10;

            &lt;span style="color:#008000;"&gt;// Si las unidades son distintas de 0, se restan de 10&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (unidades != 0)
                unidades = 10 - unidades;

            &lt;span style="color:#0000ff;"&gt;switch&lt;/span&gt; (LetraInicial)
            {
                &lt;span style="color:#008000;"&gt;// Sólo números&lt;/span&gt;
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;:
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;:
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;E&amp;quot;&lt;/span&gt;:
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;H&amp;quot;&lt;/span&gt;:
                    retVal = DigitoControl == unidades.ToString();
                    &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;

                &lt;span style="color:#008000;"&gt;// Sólo letras&lt;/span&gt;
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;K&amp;quot;&lt;/span&gt;:
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;P&amp;quot;&lt;/span&gt;:
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;Q&amp;quot;&lt;/span&gt;:
                &lt;span style="color:#0000ff;"&gt;case&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;S&amp;quot;&lt;/span&gt;:
                    retVal = DigitoControl == letrasCodigo[unidades];
                    &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;

                &lt;span style="color:#0000ff;"&gt;default&lt;/span&gt;:
                    retVal = (DigitoControl == unidades.ToString())
                            || (DigitoControl == letrasCodigo[unidades]);
                    &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;
            }

            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; retVal;

        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Obtiene la suma de todos los dígitos&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;de 23, devuelve la suma de 2 + 3&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; Int32 SumaDigitos(Int32 digitos)
        {
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sNumero = digitos.ToString();
            Int32 suma = 0;

            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (Int32 i = 0; i &amp;lt; sNumero.Length; i++)
            {
                Int32 aux;
                Int32.TryParse(sNumero[i].ToString(), &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; aux);
                suma += aux;
            }
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; suma;
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Obtiene la letra correspondiente al Dni&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetLetraNif()
        {
            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; indice = Numero % 23;
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;TRWAGMYFPDXBNJZSQVHLCKET&amp;quot;&lt;/span&gt;[indice].ToString();
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Obtiene una cadena con el número de identificación completo&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ToString()
        {
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; nif;
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; formato = &lt;span style="color:#006080;"&gt;&amp;quot;{0:0000000}&amp;quot;&lt;/span&gt;;

            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (tipo == TiposCodigosEnum.CIF &amp;amp;&amp;amp; LetraInicial == &lt;span style="color:#006080;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)
                formato = &lt;span style="color:#006080;"&gt;&amp;quot;{0:00000000}&amp;quot;&lt;/span&gt;;
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (tipo == TiposCodigosEnum.NIF)
                formato = &lt;span style="color:#006080;"&gt;&amp;quot;{0:00000000}&amp;quot;&lt;/span&gt;;
            
            nif = EsIntraComunitario ? CodigoIntracomunitario :
                &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty + LetraInicial + &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(formato,Numero ) + DigitoControl;
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; nif;
        }

        &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Comprobación de un número de identificación fiscal español&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;numero&amp;quot;&amp;gt;Numero a analizar&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Instancia de &amp;lt;see cref=&amp;quot;NumeroNif&amp;quot;/&amp;gt; con los datos del número.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Destacable la propiedad &amp;lt;seealso cref=&amp;quot;NumeroNif.EsCorrecto&amp;quot;/&amp;gt;, que contiene la verificación&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; NumeroNif CompruebaNif(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; numero)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NumeroNif(numero);
        }

    }

}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;



&lt;p&gt;En el siguiente post intentaré comentar cómo podemos crear un control de usuario que nos valide la entrada de un CIF/NIF/NIE correcto en ASP Net. Digo intentaré porque últimamente me estoy oxidando mucho con el tema de los controles de ASP. ¿Cuál es la razón?, muy sencillo, que cada día soy más vago y últimamente me estoy habituando demasiado a trabajar con los controles de DevExpress que, tal como lo veo, ofrecen una gran cantidad de opciones que, de trabajar con controles estándares me costarían bastante de hacer.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186715" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Utiles/default.aspx">Utiles</category></item><item><title>CultureInfo. Personalizar formatos</title><link>http://geeks.ms/blogs/jvelasco/archive/2010/12/22/cultureinfo-personalizar-formatos.aspx</link><pubDate>Wed, 22 Dec 2010 08:42:16 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:186253</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=186253</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2010/12/22/cultureinfo-personalizar-formatos.aspx#comments</comments><description>&lt;p&gt;Recientemente publiqué un post en el que había creado una clase que facilitaba la labor de crear &lt;a href="http://geeks.ms/blogs/jvelasco/archive/2010/12/18/c-crear-ficheros-delimitados.aspx" target="_blank"&gt;ficheros delimitados&lt;/a&gt;. Como suele ocurrir casi siempre, baso los artículos en vivencias de mi vida laboral. Es por esto que, tal como ha sucedido en el presente, en más de una ocasión, tras resolver un problema, surge otro nuevo.&lt;/p&gt;  &lt;p&gt;El caso es que, hasta el momento, cuando había tenido que crear un fichero de este tipo para enviar al exterior, siempre estaba hablando con empresas españolas. En este caso, es distinto, puesto que el fichero irá a parar a una multinacional que, lógicamente, impone sus normas. En principio, estas normas no suelen dar muchos problemas, pero sí que representan algún trastorno en lo referente a los formatos numéricos y de fechas.&lt;/p&gt;  &lt;p&gt;Reconozco que hasta el momento nunca me había preocupado mucho de estos temas de crear aplicaciones multilingües ni tal siquiera de cambiar determinados formatos, sobre todo numéricos, pero como ha llegado el momento de hacerlo, pues he empezado a interesarme, de momento, por alguna herramienta que nos ofrece el Framework. En esta ocasión no he pasado de la clase CultureInfo, aunque no descarto seguir con las interfaces &lt;strong&gt;IFormatProvider&lt;/strong&gt; e &lt;strong&gt;ICustomFormater&lt;/strong&gt;, que me han dado muy buenas vibraciones.&lt;/p&gt;  &lt;p&gt;Bueno, vamos al grano, que siempre me disipo intentando entrar en situación. El caso es que necesito tener un modo más o menos centralizado en el que pueda definir cómo quedarán los formatos de fecha y numéricos, así que lo mejor que he sabido ver es crear una clase &lt;strong&gt;CulturaPropia&lt;/strong&gt;, en la que pueda personalizar los formatos que necesito. Esta clase heredará de otra del Framework, la clase &lt;strong&gt;CultureInfo&lt;/strong&gt;.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Globalization;

&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; JnSoftware.Samples
{
    &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CulturaPropia : CultureInfo
    {
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; CulturaPropia()
            : &lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;es-ES&amp;quot;&lt;/span&gt;)
        {
            setFormatoNumerico();
            setFormatoMoneda();
            setFormatoFecha();
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Establece formatos numéricos&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; setFormatoNumerico()
        {
            NumberFormatInfo n = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.NumberFormat;
            n.NumberNegativePattern = 0;
            n.NumberGroupSeparator = &lt;span style="color:#006080;"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;;
            n.NumberDecimalSeparator = &lt;span style="color:#006080;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;;
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Establece formatos de Moneda&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; setFormatoMoneda()
        {
            NumberFormatInfo n = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.NumberFormat;
            n.CurrencyPositivePattern = 3;
            n.CurrencySymbol = &lt;span style="color:#006080;"&gt;&amp;quot;EUR&amp;quot;&lt;/span&gt;;
        }

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Establece formatos de fecha&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; setFormatoFecha()
        {
            DateTimeFormatInfo d = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.DateTimeFormat;
            d.LongDatePattern = &lt;span style="color:#006080;"&gt;&amp;quot;&amp;#39;Montcada i Reixac, &amp;#39;dd&amp;#39; de &amp;#39;MMMM&amp;#39; de &amp;#39;yyyy&amp;quot;&lt;/span&gt; ;
            d.ShortDatePattern = &lt;span style="color:#006080;"&gt;&amp;quot;dd.MMM.yyyy&amp;quot;&lt;/span&gt;;
            d.FirstDayOfWeek = DayOfWeek.Monday;
            d.TimeSeparator = &lt;span style="color:#006080;"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;;
            d.DateSeparator = &lt;span style="color:#006080;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Como se puede apreciar, la clase es bien sencilla, puesto que, desde el mismo constructor, lo que intenta es “heredar” toda la información de una referencia cultural completa (en el ejemplo es-ES, correspondiente a España). A partir de aquí, tan sólo es cuestión de ir modificando aquellas propiedades de la clase que necesitemos.&lt;/p&gt;

&lt;p&gt;Para la ejecución de las pruebas, he creado un proyecto de consola en el cual, sencillamente, muestro una comparación entre tres referencias diferentes: americana, española y la que he creado. Es posible que existan otras opciones de hacerlo, pero he visto que me resulta muy cómodo cambiar la referencia cultural al Thread actual, extraer los datos y volver a dejar tal cuál estaba la referencia.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Globalization;

&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; JnSoftware.Samples
{
    &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; EjecucionPruebas
    {
        &lt;span style="color:#008000;"&gt;// Muestra diversa información en pantalla.&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; MuestraEjemplo(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; titulo, CultureInfo cultura)
        {
            DateTime fecha = DateTime.Now;
            &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; numero = 12345.6789;

            System.Threading.Thread.CurrentThread.CurrentCulture = cultura;
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;, Console.WindowWidth - 1));
            Console.WriteLine(titulo);
            Console.WriteLine(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;, Console.WindowWidth - 1));
            Console.ResetColor();
            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Fecha 1  : \t{0:d}&amp;quot;&lt;/span&gt;, fecha);
            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Fecha 2  : \t{0:D}&amp;quot;&lt;/span&gt;, fecha);
            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;General  : \t{0:G}&amp;quot;&lt;/span&gt;, numero);
            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Moneda   : \t{0:C}&amp;quot;&lt;/span&gt;, numero);
            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Decimal  : \t{0:D}&amp;quot;&lt;/span&gt;, (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)numero);
            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Número   : \t{0:N}&amp;quot;&lt;/span&gt;, numero);
            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;P. Fijo  : \t{0:F}&amp;quot;&lt;/span&gt;, numero);
        }

        &lt;span style="color:#008000;"&gt;// Ejecución de las pruebas.&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()
        {
            &lt;span style="color:#008000;"&gt;// Lectura de la referencia actual&lt;/span&gt;
            CultureInfo actual = System.Threading.Thread.CurrentThread.CurrentCulture;
            Console.WindowHeight = 31;
            EjecucionPruebas test = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EjecucionPruebas();
            &lt;span style="color:#008000;"&gt;// Cambios de referencia culturales &lt;/span&gt;
            test.MuestraEjemplo(&lt;span style="color:#006080;"&gt;&amp;quot;en-US&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CultureInfo(&lt;span style="color:#006080;"&gt;&amp;quot;en-US&amp;quot;&lt;/span&gt;));
            test.MuestraEjemplo(&lt;span style="color:#006080;"&gt;&amp;quot;es-ES&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CultureInfo(&lt;span style="color:#006080;"&gt;&amp;quot;es-ES&amp;quot;&lt;/span&gt;));
            test.MuestraEjemplo(&lt;span style="color:#006080;"&gt;&amp;quot;Propia&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CulturaPropia());
            test = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;
            &lt;span style="color:#008000;"&gt;// Se establece la referencia inicial&lt;/span&gt;
            System.Threading.Thread.CurrentThread.CurrentCulture = actual;
            Console.ReadKey();
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Tal como puede apreciarse, salvo algún ornamento añadido para que se muestre mejor la pantalla resultante, lo único que se hace en la aplicación es mostrar los mismos datos en las diferentes referencias culturales.&lt;/p&gt;

&lt;p&gt;El resultado será el siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jvelasco/image_5F00_2.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jvelasco/image_5F00_thumb.png" width="644" height="395" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186253" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>C# - Crear ficheros delimitados</title><link>http://geeks.ms/blogs/jvelasco/archive/2010/12/18/c-crear-ficheros-delimitados.aspx</link><pubDate>Sat, 18 Dec 2010 15:56:25 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:186107</guid><dc:creator>Jesús Velasco</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jvelasco/rsscomments.aspx?PostID=186107</wfw:commentRss><comments>http://geeks.ms/blogs/jvelasco/archive/2010/12/18/c-crear-ficheros-delimitados.aspx#comments</comments><description>&lt;p&gt;No será la primera vez que en alguna de mis aplicaciones he tenido que crear ficheros de texto para intercambiar información con otras empresas. Para bancos, cajas de ahorro, ayuntamientos y un conjunto grande de entidades es moneda de cambio el trabajar con este tipo de documentos. &lt;/p&gt;  &lt;p&gt;Aunque no es un punto excesivamente complicado, cada vez que he tenido que hacer un fichero ASCII delimitado he creado algún procedimiento que se encargase de este trabajo. Hoy me he propuesto crearme una clase que me permita generalizarme un poco la labor.&lt;/p&gt;  &lt;p&gt;Si cogemos un ejemplo, como puede ser la creación de un fichero de &lt;em&gt;adeudo por domiciliaciones &lt;/em&gt;(&lt;a href="http://www.tesoreria.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=138:jlblat741963&amp;amp;catid=59:normativa-nacional-e-internacional&amp;amp;Itemid=90" target="_blank"&gt;Norma 19&lt;/a&gt;), podríamos resumir diciendo que tiene la siguiente estructura:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;cabecera &lt;/li&gt;    &lt;li&gt;lista de datos &lt;/li&gt;    &lt;li&gt;resumen &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Por tanto, con el fin de facilitar el trabajo, además de los procedimientos que necesitaremos para poder crear el fichero, deberemos tener unos métodos que nos permitan escribir una lista completa de datos o una línea de texto. Algo así como:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CamposDelimitados
 {
     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// Permite enviar todos los elementos de una lista al fichero de salida&lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;lista&amp;quot;&amp;gt;Lista de elementos que deberán aparecer &lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// en el fichero de salida&amp;lt;/param&amp;gt;&lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;La definición de la estructura de salida deberá especificarse &lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// en el método ToString()&amp;lt;/remarks&amp;gt;&lt;/span&gt;
     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertaLista(IList lista)
     {
         &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.NotImplementedException();
     }


     &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// Permite la inserción de una línea individual en el fichero de salida&lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
     &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;texto&amp;quot;&amp;gt;Texto a incorporar en el fichero de salida&amp;lt;/param&amp;gt;&lt;/span&gt;
     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertaLinea(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; texto)
     {
         &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.NotImplementedException();
     }
 }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Por tanto, una clase que tenga algún tipo de generalización y que sea útil para tal acción podría ser la siguiente:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.IO;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Text;


&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; JnSoftware.Utiles
{

    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Representa un escritor de ficheros delimitados.&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CamposDelimitados
    {

        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; StringBuilder textoSalida = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StringBuilder();

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite enviar todos los elementos de una lista al &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// fichero de salida&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;lista&amp;quot;&amp;gt;Lista de elementos que deberán &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// aparecer en el fichero de salida&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;La definición de la estructura de salida &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// deberá especificarse en el método ToString()&amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertaLista(IList lista)
        {
            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; lista)
                InsertaLinea(item.ToString());
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite la inserción de una línea.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;texto&amp;quot;&amp;gt;Texto a incorporar en el fichero &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// de salida&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertaLinea(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; texto)
        {
            textoSalida.AppendLine(texto);
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Crea el fichero de salida&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;nombreFichero&amp;quot;&amp;gt;Ruta completa del fichero &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// que contendrá los datos delimitados&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; creaFichero(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; nombreFichero)
        {
            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (StreamWriter sw =
                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StreamWriter(nombreFichero, &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;, Encoding.UTF8))
            {
                sw.Write(textoSalida);
                sw.Flush();
                sw.Close();
            }
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;¿En qué me ayudará esta clase?. Es una pregunta sencilla de responder, puesto que fijándonos en el método &lt;strong&gt;InsertaLista&lt;/strong&gt;, podremos deducir que bastará con crear una implementación propia del método ToString() de nuestras clases para definir la delimitación de los datos. &lt;/p&gt;

&lt;p&gt;Claro que está que la implementación personalizada (o customizada, que últimamente está muy de moda este vocablo) del método ToString() representa un par de problemas adicionales, Por un lado, es algo personal ya que siempre me ha fastidiado bastante que hay empresas que suelen darte la columna inicial y la final y hay otras que te dan la longitud que deberá tener cada columna de datos; por otro lado, está la problemática de hacer que nuestras columnas de datos adquieran una longitud fija. Con la intención de solventar estos dos problemas, creo una serie de métodos estáticos en la misma clase para que agilicen la adaptación de los datos a la cadena resultante.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; JnSoftware.Utiles
{

    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Describe el modo de alineación de un texto dentro &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// de un archivo delimitado&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt; TextAlignment { Left, Right }


    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Representa un escritor de ficheros delimitados.&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CamposDelimitados
    {

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite adaptar el contenido de un campo a un formato de tamaño fijo.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;campo&amp;quot;&amp;gt;Contenido del campo en formato string&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;inicio&amp;quot;&amp;gt;Entero que representa la posición &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// inicial en la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;fin&amp;quot;&amp;gt;Entero que representa la posición final en &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena preparada para insertar en el fichero&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PreparaLinea(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; campo, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; inicio, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; fin)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; PreparaLinea(campo, inicio, fin, TextAlignment.Left);
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite adaptar el contenido de un campo a un formato de tamaño fijo.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;campo&amp;quot;&amp;gt;Contenido del campo en formato string&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;longitudCampo&amp;quot;&amp;gt;Longitud que deberá tener el campo &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// en la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena preparada para insertar en el fichero&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PreparaLinea(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; campo, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; longitudCampo)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; PreparaLinea(campo, longitudCampo, TextAlignment.Left);
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite adaptar el contenido de un campo a un formato de tamaño fijo.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;campo&amp;quot;&amp;gt;Contenido del campo en formato string&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;inicio&amp;quot;&amp;gt;Entero que representa la posición inicial &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// en la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;fin&amp;quot;&amp;gt;Entero que representa la posición inicial en &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;alineacion&amp;quot;&amp;gt;Alineación del texto en el fichero &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// delimitado&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena preparada para insertar en el fichero&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PreparaLinea(
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; campo,
            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; inicio,
            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; fin,
            TextAlignment alineacion)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; PreparaLinea(campo, fin - inicio, alineacion);
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite adaptar el contenido de un campo a un formato de tamaño fijo.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;campo&amp;quot;&amp;gt;Contenido del campo en formato string&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;longitud&amp;quot;&amp;gt;Longitud que deberá tener el campo en la &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;alineacion&amp;quot;&amp;gt;Alineación del texto en el fichero &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// delimitado&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena preparada para insertar en el fichero&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PreparaLinea(
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; campo,
            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; longitud,
            TextAlignment alineacion
            )
        {
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; espacios = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, longitud - campo.Length);
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (alineacion == TextAlignment.Left)
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; campo + espacios;
            &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; espacios + campo;
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Por tanto, podemos decir que la clase, una vez finalizada, será la siguiente:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.IO;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Text;


&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; JnSoftware.Utiles
{

    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Describe el modo de alineación de un texto dentro &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// de un archivo delimitado&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt; TextAlignment { Left, Right }


    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Representa un escritor de ficheros delimitados.&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CamposDelimitados
    {

        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; StringBuilder textoSalida = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StringBuilder();

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite enviar todos los elementos de una lista al &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// fichero de salida&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;lista&amp;quot;&amp;gt;Lista de elementos que deberán &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// aparecer en el fichero de salida&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;remarks&amp;gt;La definición de la estructura de salida &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// deberá especificarse en el método ToString()&amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertaLista(IList lista)
        {
            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; lista)
                InsertaLinea(item.ToString());
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite la inserción de una línea.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;texto&amp;quot;&amp;gt;Texto a incorporar en el fichero &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// de salida&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertaLinea(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; texto)
        {
            textoSalida.AppendLine(texto);
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Crea el fichero de salida&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;nombreFichero&amp;quot;&amp;gt;Ruta completa del fichero &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// que contendrá los datos delimitados&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; creaFichero(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; nombreFichero)
        {
            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (StreamWriter sw =
                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StreamWriter(nombreFichero, &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;, Encoding.UTF8))
            {
                sw.Write(textoSalida);
                sw.Flush();
                sw.Close();
            }
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite adaptar el contenido de un campo a un formato de tamaño fijo.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;campo&amp;quot;&amp;gt;Contenido del campo en formato string&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;inicio&amp;quot;&amp;gt;Entero que representa la posición &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// inicial en la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;fin&amp;quot;&amp;gt;Entero que representa la posición final en &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena preparada para insertar en el fichero&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PreparaLinea(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; campo, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; inicio, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; fin)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; PreparaLinea(campo, inicio, fin, TextAlignment.Left);
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite adaptar el contenido de un campo a un formato de tamaño fijo.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;campo&amp;quot;&amp;gt;Contenido del campo en formato string&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;longitudCampo&amp;quot;&amp;gt;Longitud que deberá tener el campo &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// en la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena preparada para insertar en el fichero&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PreparaLinea(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; campo, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; longitudCampo)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; PreparaLinea(campo, longitudCampo, TextAlignment.Left);
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite adaptar el contenido de un campo a un formato de tamaño fijo.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;campo&amp;quot;&amp;gt;Contenido del campo en formato string&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;inicio&amp;quot;&amp;gt;Entero que representa la posición inicial &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// en la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;fin&amp;quot;&amp;gt;Entero que representa la posición inicial en &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// la delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;alineacion&amp;quot;&amp;gt;Alineación del texto en el fichero &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// delimitado&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena preparada para insertar en el fichero&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PreparaLinea(
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; campo,
            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; inicio,
            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; fin,
            TextAlignment alineacion)
        {
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; PreparaLinea(campo, fin - inicio, alineacion);
        }


        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Permite adaptar el contenido de un campo a un formato de tamaño fijo.&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;campo&amp;quot;&amp;gt;Contenido del campo en formato string&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;longitud&amp;quot;&amp;gt;Longitud que deberá tener el campo en la &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// delimitación&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;alineacion&amp;quot;&amp;gt;Alineación del texto en el fichero &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// delimitado&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Cadena preparada para insertar en el fichero&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; PreparaLinea(
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; campo,
            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; longitud,
            TextAlignment alineacion
            )
        {
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; espacios = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, longitud - campo.Length);
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (alineacion == TextAlignment.Left)
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; campo + espacios;
            &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; espacios + campo;
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;h2&gt;¿Cómo utilizar la clase?&lt;/h2&gt;

&lt;p&gt;Creo un pequeño ejemplo en el que se muestra cómo podemos hacer uso de la clase en la creación de un fichero delimitado. En este ejemplo queda claro cómo definir el método ToString() para que se adapte al formato deseado:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; JnSoftware.Utiles;

&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; TextosDelimitadosTest
{
    &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CreacionFicheroDelimitado
    {

        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Id { get; set; }
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Texto { get; set; }
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DateTime Fecha { get; set; }

        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ToString()
        {
            &lt;span style="color:#008000;"&gt;// En el método ToString() indicamos cómo deberá aparecer la información&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 
                CamposDelimitados.PreparaLinea(Id.ToString(),1, 7, TextAlignment.Right)
                + CamposDelimitados.PreparaLinea(Texto, 30)
                + CamposDelimitados.PreparaLinea(Fecha.ToShortDateString(), 10);
                ;
        }

        &lt;span style="color:#008000;"&gt;// Ejecución de las pruebas&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()
        {
            &lt;span style="color:#008000;"&gt;// Fichero de salida&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; fichero = &lt;span style="color:#006080;"&gt;@&amp;quot;C:\Users\j.velasco\Desktop\exitTest\salida.txt&amp;quot;&lt;/span&gt;;

            &lt;span style="color:#008000;"&gt;// Creación de una lista de ejemplo&lt;/span&gt;
            List&amp;lt;CreacionFicheroDelimitado&amp;gt; lista = 
                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;CreacionFicheroDelimitado&amp;gt;();
            &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 1; i &amp;lt; 20; i++)
            {
                lista.Add(
                    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CreacionFicheroDelimitado()
                    {
                        Id = i,
                        Texto = &lt;span style="color:#006080;"&gt;&amp;quot;Texto &amp;quot;&lt;/span&gt; + i.ToString(), 
                        Fecha = DateTime.Now 
                    }
                    );
            }

            &lt;span style="color:#008000;"&gt;// Creación del fichero&lt;/span&gt;
            CamposDelimitados cd = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CamposDelimitados();
            cd.InsertaLinea(&lt;span style="color:#006080;"&gt;&amp;quot;-- Cabecera del texto&amp;quot;&lt;/span&gt;);
            cd.InsertaLista(lista);
            cd.creaFichero(fichero);
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186107" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/jvelasco/archive/tags/Ejemplos/default.aspx">Ejemplos</category></item></channel></rss>
