Blog

Formatar String com C#


Ao exibir informações de datas, valores numéricos, valores customizados como cpf, cnpj, cep, rg, entre outros, é importante definir uma formatação adequada ao valor. Existem formatos que o .net já possuí configuração pré-definida para se ajustar conforme a "cultura", conforme exemplos a seguir:


Especificador

Tipo

Formato

Saída (Ex.: Tipo double 1.2345)

Saída (Ex.: Tipo int -12345)

c Currency (Moeda) {0:c} £1.23 -£12,345.00
d Decimal {0:d} System.FormatException -12345
e Exponencial / Formatação científica {0:e} 1.234500e+000 -1.234500e+004
f Ponto fixo {0:f} 1.23 -12345.00
g Generalizada {0:g} 1.2345 -12345
n Numérica {0:n} 1.23 -12,345.00
r Arredondado {0:r} 1.23 System.FormatException
x Hexadecimal {0:x4} System.FormatException ffffcfc7

Existem formatos customizados que permitem trabalhar de forma mais flexível, atendendo a desenvolvedores que precisam definir um formato para seu próprio uso:

Especificador

Tipo

Formato

Saída (Ex.: Tipo double 1234.56)

0 Completar com zeros {0:00.000} 1234.560
# Máscarar um número {0:#.##} 1234.56
. Posicionar o separador de decimal {0:0.0} 1234.6
, Posicionar o separador de milhar {0:0,0} 1,235
% Porcentagem {0:0%} 123456%

Um dos tipos de formatação mais usados é o de data, que por sua vez permite uma série de configurações, podendo apresentar diferentes posições de Dia, Mês e Ano, em formato reduzido, médio ou longo, com ou sem a hora entre outras definições mais específicas para Data e Hora:

É importante notar que a apresentação das datas variam conforme a Cultura (CultureInfo) definida. Para o padrão brasileiro ("pt-BR") temos o seguinte comportamento:

Especificador

Tipo

Saída (Ex.: 19 de Setembro de 1980 14:30:59)

d Data curta 19/09/1980
D Data long 19 Setembro 1980
t Hora Curta 14:30
T Hora Longa 14:30:59
f Data e Hora 19 Setembro 1980 14:30
F Data e Hora completo 19 Setembro 1980 14:30:59
g Data de Hora padrão 19/09/1980 14:30
G Data de Hora padrão longo 19/09/1980 14:30:59
M Dia / Mês 19 Setembro
r RFC1123 date string Sex, 19 Set 1980 14:30:59 GMT
s Sortable data/hora 1980-09-19T14:30:59
u Hora Universal, Timezone local 1980-09-19 14:30:59Z
Y Mês / Ano Setembro 1980

Na tabela abaixo é possível ver como formatar uma data de forma customizada:

Especificador Tipo Saída (Ex.: Setembro 19, 1980 14:30:59)
dd Dia 19
ddd Nome curto do dia Sex
dddd Nome completo do dia Sexta-feira
hh 2 dígitos para a hora 02
HH 2 dígitos para a hora (24 horas) 14
mm 2 dígitos para o minuto 30
MM Mês 09
MMM Nome curto do Mês Set
MMMM Nome do Mês Setembro
ss Segundos 59
tt AM/PM PM
yy 2 dígitos do Ano 80
yyyy 4 dígitos do Ano 1980
: Separador, ex. {0:hh:mm:ss} 14:30:59
/ Seperator, ex. {0:dd/MM/yyyy} 08/06/1970

(Este artigo foi atualizado em 08/01/2017)

C# .net

Utilizando o atributo ObsoleteAttribute


No desenvolvimento de ferramentas que serão reutilizadas, como frameworks, é comum haver métodos, propriedades, classes, etc, que deixem de ser válidas e passem a não ser mais utilizadas, seja por mudanças na lógica, ou por qualquer motivo. Nessas situações dispomos de um atributo do .NET framework, que torna obsoleto o elemento, podendo deixá-lo ainda com possibilidade de uso ou não. No exemplo abaixo pode-se ver um método obsoleto:

 
[Obsolete("Esse método é obsoleto, utilize o método Y")]
public void X()
{
    [...]
}

Para impedir que o método continue sendo utilizado, adicionamos um ultimo parâmetro:
 
[Obsolete("Esse método é obsoleto, utilize o método Y", true)]
public void X()
{
    [...]
}

C# .net

101 exemplos de operações com LINQ


Para quem está começando ou até mesmo já utiliza LINQ nos seus projetos aqui vai uma lista com 101 exemplos de operações com LINQ. É bem provável que aquela sua dúvida possa estar aqui.

 
  
Restriction Operators
Where - Simple 1
Where - Simple 2
Where - Simple 3
Where - Drilldown
Where - Indexed

Projection Operators

Select - Simple 1
Select - Simple 2
Select - Transformation
Select - Anonymous Types 1
Select - Anonymous Types 2
Select - Anonymous Types 3
Select - Indexed
Select - Filtered
SelectMany - Compound from 1
SelectMany - Compound from 2
SelectMany - Compound from 3
SelectMany - from Assignment
SelectMany - Multiple from
SelectMany - Indexed

Partitioning Operators

Take - Simple
Take - Nested
Skip - Simple
Skip - Nested
TakeWhile - Simple TakeWhile - Indexed
SkipWhile - Simple
SkipWhile - Indexed

Ordering Operators

OrderBy - Simple 1
OrderBy - Simple 2
OrderBy - Simple 3
OrderBy - Comparer
OrderByDescending - Simple 1
OrderByDescending - Simple 2
OrderByDescending - Comparer
ThenBy - Simple
ThenBy - Comparer
ThenByDescending - Simple
ThenByDescending - Comparer
Reverse
Grouping Operators
GroupBy - Simple 1
GroupBy - Simple 2
GroupBy - Simple 3
GroupBy - Nested
GroupBy - Comparer
GroupBy - Comparer, Mapped

Set Operators

Distinct - 1
Distinct - 2
Union - 1
Union - 2
Intersect - 1
Intersect - 2
Except - 1
Except - 2

Conversion Operators

To Array
To List
To Dictionary
OfType

Element Operators

First - Simple
First - Condition
FirstOrDefault - Simple
FirstOrDefault - Condition
ElementAt

Generation Operators

Range
Repeat

Quantifiers

Any - Simple
Any - Grouped
All - Simple
All - Grouped
Aggregate Operators
Count - Simple
Count - Conditional
Count - Nested
Count - Grouped
Sum - Simple
Sum - Projection
Sum - Grouped
Min - Simple
Min - Projection
Min - Grouped
Min - Elements
Max - Simple
Max - Projection
Max - Grouped
Max - Elements
Average - Simple
Average - Projection
Average - Grouped
Aggregate - Simple
Aggregate - Seed

Miscellaneous Operators

Concat - 1
Concat - 2
EqualAll - 1
EqualAll - 2

Custom Sequence Operators

Combine

Query Execution

Deferred Execution
Immediate Execution
Query Reuse

Utility Routines

GetProductList code

Join Operators

Cross Join
Group Join
Cross Join with Group Join
Left Outer Join

C# .net LINQ

SQL Compact, Identity Columns e Entity Framework


Para quem está desenvolvendo ou quer desenvolver um projeto utilizando o SQL Server Compact 3.5, saiba que existe uma falha relacionada ao comportamento identity em colunas das tabelas da base da dados. Uma alternativa para solucionar isto é não definir na base de dados as colunas como identity e criar um controle externo para índice dos registros. Uma forma de controlar os índices das tabelas é consultando o ultimo índice adicionado, claro que não funcionará como o identity normal, que define o índice baseando-se em um contador, mas funcionará muito bem e permitira o uso da base de dados. Abaixo vemos a implementação desta solução:

 
public static class ExtensionMethods
{
    public static TResult NextId(this ObjectSet table, Expression> selector)
        where TSource : class
    {
        TResult lastId = table.Any() ? table.Max(selector) : default(TResult);

        if (lastId is int)
        {
            lastId = (TResult)(object)(((int)(object)lastId) + 1);
        }

        return lastId;
    }
}

E utilize do seguinte artifício para controlar o índice dos registros:
 
using (DBEntities contexto = new DBEntities())
{
    // cria aluno define um novo objeto aluno
    Aluno aluno = new Aluno() {
        contexto.Aluno.NextId(a => a.Id),
        Nome = "João Felipe Portela" }; 

    // adiciona a lista de alunos
    contexto.AddToAluno(aluno); 

    // salva as alterações
    contexto.SaveChanges();
}

Mais informações em enigmadomain.wordpress.com.


(Este artigo foi atualizado em 08/01/2017)

C# .net SQL Compact Identity Columns Entity Framework

Manipulando arquivos Word usando C#


Desenvolver aplicações que manipulem arquivos do Microsoft Word utilizando .net Framework é muito simples. Neste artigo mostrarei sem entrar em muitos detalhes o que é necessário fazer para que uma aplicação desenvolvida utilizando o .net Framework alimente um documento Word. Importante ressaltar que utilizarei da forma mais básica para atingir este propósito, podendo haver rotinas mais complexas para criação de documentos com as mais variadas tecnologias suportadas pelo aplicativo. 


 Primeiramente deve-se adicionar ao conjunto de referencias o seguinte item:
 
Microsoft.Office.Interop.Word

Logo após, definir o namespace:
 
using Word = Microsoft.Office.Interop.Word;

Agora finalmente começamos com a implementação:
 
// Cria a varável do tipo Missing
object missing = System.Reflection.Missing.Value;

// Cria a variável da aplicação Word
Word.Application wordApp = new Word.ApplicationClass();

// Cria e define as demais variáveis
object readOnly = false;
object isVisible = false;
object fileName = @"c:\texto.doc";
object saveAs = @"c:\novo_texto.doc";

// Define o Word como não visivel
wordApp.Visible = false;

// Cria um objeto Documento Word baseado em um arquivo existente
Word.Document doc = wordApp.Documents.Open(ref fileName, ref missing, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible, ref missing, ref missing, ref missing, ref missing);

// Ativa o documento
doc.Activate();

// Acrescenta informações no inicio do documento
doc.Content.InsertBefore("Conversando com o Microsoft Word!\r\n\r\n");

// Acrescenta informações no fim do documento
doc.Content.InsertAfter("\r\n\r\nEstá é uma aplicação que utiliza tecnologia Microsoft.");

// Salva o documento do Word com o novo nome
doc.SaveAs(ref saveAs, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

// Fecha o documento Word
doc.Close(ref missing, ref missing, ref missing);

É importante perceber que devido a não terem sido feitas definições de usuário é preciso que o documento do Word seja criado pelo usuário da aplicação, caso contrário uma mensagem de erro de permissão será exibida.


(Este artigo foi atualizado em 08/01/2017)

C# .net Word