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: {0}| Hora: {1}| Data(Hora): {0}({1})",DateTime.Now.ToShortDateString(),DateTime.Now.ToShortTimeString()));

Neste exemplo estamos exibindo a data e a hora atual, observe que “{0}” e “{1}” 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.