Vamos entender a relação entre eles e como podemos facilitar a nossa vida com formatação de texto e informação para os usuários.
Culture especifica a localidade, sistema de escrita, o calendário utilizado e o formato para a data, as cadeias de caracteres de classificação, região entre outras informações.
Ou seja, dependendo da cultura corrente podemos ter uma exibição diferente, por exemplo, se a cultura for “pt-BR” teremos para a formatação de moeda os seguintes resultados “R$ 0.01” para valores positivos e “-R$ 0.01” para negativos se a cultura for “en-US” teremos “$ 0.01” para positivo e “<$ 0.01>” para negativos. Isso significa que se você configurar seu computador para utilizar os padrões inglês(EUA) você vai ter um formato de exibição diferente do meu que esta no padrão português(Brasil).
Vamos descobrir qual a cultura corrente estamos utilizando e já vamos ver um pouco do poder do String.Format().
CultureInfo CT = Thread.CurrentThread.CurrentCulture;
Console.WriteLine(String.Format("|{0,-7}|{1,-20}|", "Nome", "Cultura"));
Console.WriteLine(String.Format("|{0,7}|{1,20}|",CT.Name, CT.NativeName));
A primeira linha pegamos a cultura corrente da thread corrente e colocamos em um objeto do tipo CultureInfo. Na segunda linha temos a impressão de 2 valores “Nome” e “Cultura” utilizando String.Format e a terceira linha faz a mesma coisa que a segunda só modificando os valores e a string de formatação.
Você deve ter observado que o primeiro parâmetro do String.Format() é uma string e aparentemente tem umas coisas estranhas nele, não se preocupe só parece mais na verdade é simples, vamos lá entender.
Temos na segunda linha “|{0,-7}|{1,-20}|”, vamos parte a parte, as barras “|” são texto comum ou seja serão exibidas nesta mesma forma, depois temos “{0,-7}”, as chaves “{“ estão cercando o indexador “0” que define qual dos objetos a serem exibidos ele representa e após a virgula “,” temos “-7” que diz que o espaço reservado para a informação é de sete caracteres e como ele esta negativo será completado após o valor com espaços. Isso é feito igualmente para o “{1,-20}” com a diferença do indexador “1” e a quantidade de caracteres “-20”. Resumindo, temos na primeira posição “Nome”, na segunda “Cultura”, quando executado a segunda linha teremos algo do tipo “|Nome |Cultura|”.
Na terceira linha temos “|{0,7}|{1,20}|”, conforme vimos anteriormente as barras serão exibidos normalmente, temos 2 indexadores “{0,7}” e {1,20}”, com a única diferença que eles estão positivos, isso quer dizer que os espaços em branco serão antes dos valores. Digamos que a cultura esteja como “pt-BR”, teremos então o seguinte resultado: “| pt-br| Portugues (Brasil)|”
Como você pode observar, podemos criar frases com varias partes variando o valor, definir um espaço e ainda definir se será completado com espaços em branco antes ou depois do valor, podemos ter vários valores a ser exibidos, vamos ver mais um exemplo.
Console.WriteLine(String.Format("Data: | Hora: | Data(Hora): ()",DateTime.Now.ToShortDateString(),DateTime.Now.ToShortTimeString()));
Neste exemplo estamos exibindo a data e a hora atual, observe que “” e “” aparecem 2 vezes cada um, ou seja vamos exibir na mesma frase duas vezes a data e 2 vezes a hora com um texto pré-definido, isso de uma forma direta ficaria.
Console.WriteLine("Data: " + DateTime.Now.ToShortDateString() + "| Hora: " + DateTime.Now.ToShortTimeString() + "| Data(Hora): " + DateTime.Now.ToShortDateString() + "(" + DateTime.Now.ToShortTimeString() + ")");
Ficou meio confuso e com um monte de concatenação.
Bom, vimos que para cada objetos contido no array (segundo parâmetro, terceiro parâmetro e assim por diante) a ser exibido temos um representante para ele na string, vimos também que podemos definir espaços para cada um deles dentro da string e caso menores serão completados por espaços antes ou depois do valor.
Mas não é só isso que podemos fazer com o string.Format(), você já precisou formatar um valor Double com formato moeda, até ai tudo bem, mas você descobriu que tem alguém utilizando uma maquina com uma cultura diferente ou o servidor web que você migrou está com uma cultura diferente e o valor não esta saindo em reais (R$) por exemplo e sim em dólar ($), como resolver isso.
Vamos imaginar que você esteja fazendo assim.
Console.WriteLine(String.Format("{0:C}", 189.99));
Até aqui tudo bem, você não esta utilizando concatenações e muito menos criou uma função para isso e sim utilizando recursos disponíveis no framework. Varias conversões e formatações feitas no sistema por padrão esta utilizado a cultura corrente como provider, como podemos resolver a exibição do valor alterando o provider ou cultura?
Vou mostrar 2 soluções, a primeira é definindo a cultura da thread no inicio da execução, a segunda é definindo a cultura como provider na hora da utilização do string.Format.
1º) No inicio da aplicação e a cada inicio de uma nova thead você define a cultura da seguinte forma.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
2º) Ou passando como provider para o string.Formt() uma nova cultura já definida, como demonstro abaixo.
Console.WriteLine(String.Format(new CultureInfo("pt-BR"), "{0:C}", 189.99));
Destas formas você controla a cultura utilizada dentro de seu aplicativo, pode ser ela windows form ou web (no caso web se o servidor estiver configurado com uma cultura diferente a que você quer)
Podemos definir varias forma de exibir uma data, um inteiro, um Double e outros.
Abaixo tem uma tabela com as possibilidades de formatos de datas.
Especificador |
Formato |
Tipo |
Saida |
d |
{0:d} |
Data Curto |
08/07/2010 |
D |
{0:D} |
Data longa |
Quinta-feira, 08 de Julho de 2010 |
t |
{0:t} |
Hora curta |
21:45 |
T |
{0:T} |
Hora longa |
21:45:33 |
f |
{0:f} |
Data completa e hora |
Quinta-feira, 8 de julho de 2010 21:45 |
F |
{0:F} |
Data complete e hora longa |
Quinta-feira, 8 de julho de 2010 21:45:33 |
g |
{0:g} |
Data padrão e hora |
08/07/2010 21:45 |
G |
{0:G} |
Data padrão e hora longa |
08/07/2010 21:45:33 |
M |
{0:M} |
Dia / Mês |
08 de julho |
r |
{0:r} |
RFC1123 Data escrita |
Qui, 08 Jul 2010 21:45:33 GMT-3 |
s |
{0:s} |
Data Hora classificada |
2010-07-08T21:45:33 |
u |
{0:u} |
Hora Universal, local timezone |
2010-07-08T21:45:33z |
Y |
{0:Y} |
Mês / Ano |
Junho de 2010 |
Temos também formatações personalizadas para datas.
Especificador |
Formato |
Tipo |
Saída |
dd |
{0:dd} |
Dia |
08 |
ddd |
{0:ddd} |
Nome curto do dia |
qui |
dddd |
{0:dddd} |
Nome inteiro do dia |
Quinta-feira |
hh |
{0:hh} |
Hora com 2 digitos |
09 |
HH |
{0:HH} |
Hora com 2 dig (24 h) |
21 |
mm |
{0:mm} |
Minutos com 2 digitos |
56 |
MM |
{0:MM} |
Mês |
07 |
MMM |
{0:MMM} |
Nome curto do mês |
Jul |
MMMM |
{0:MMMM} |
Nome inteiro do meês |
Julho |
ss |
{0:ss} |
Segundos |
33 |
tt |
{0:tt} |
AM/PM |
PM |
yy |
{0:yy} |
Ano com 2 digitos |
10 |
yyyy |
{0:yyyy} |
Ano com 4 digitos |
2010 |
: |
{0:dd:MM:yyyy} |
Separador |
12:30:59 |
- |
{0:dd-MM-yyyy} |
Separador |
08-07-2010 |
/ |
{0:dd/MM/yyyy} |
Separador |
08/07/2010 |
Segue uma tabela com as formatações de números.
Especificador |
Formato |
Tipo |
Saída Double(1000.00) |
Saída Int(-1000) |
c |
{0:c} |
Moeda |
R$ 1.000,00 |
-R$ 1.000,00 |
d |
{0:d} |
Decimal |
System.FormatException |
-1000 |
e |
{0:e} |
Expoente / Cienteifico |
1,000000e+003 |
-1,000000e+003 |
f |
{0:f} |
Ponto fixo |
1000,00 |
-1000 |
g |
{0:g} |
Geral |
1.000,00 |
-1.000,00 |
n |
{0:n} |
Número |
1.000,00 |
-1.000,00 |
r |
{0:r} |
round trippable |
1000 |
System.FormatException |
x |
{0:x4} |
hexadecimal |
System.FormatException |
fffffc18 |
Temos também formatação personalizada para números.
Especificador |
Formato |
Tipo |
Saída (1000) |
0 |
{0:00.000} |
Zero de espaços reservados |
1.234.560 |
# |
{0:#.##} |
Espaço reservado para digito |
1234.56 |
. |
{0:0.0} |
Espaço reservado ponto decimal |
1234.6 |
, |
{0:0,0} |
Separador de milhar |
1,235 |
% |
{0:0%} |
Porcentagem |
123456% |
Chegamos ao fim deste artigo, espero novamente ter conseguido passar a idéia desses recursos. Até a próxima, ahh não se esqueçam de fazer o download do exemplo.