Trilhas
/
C#
C#
/
Programa
/
Formatação de strings
Fo

Formatação de strings em C#

13 exercícios

Sobre Formatação de strings

Os mecanismos para formatar strings em C#/.NET são muitos e variados: desde a concatenação simples de objetos, passando por chamadas ao método object.ToString() sobrescrito, até o uso de ICustomFormatter (não abordado neste exercício).

Os dois mecanismos mais comuns para formatar strings são a interpolação de strings e o String.Format(). A classe StringBuilder (cross-ref-tba) também pode ser usada para montar uma string quando há complexidade envolvida, como várias linhas.

Usando ToString()

System.Object(), do qual todas as classes e structs herdam, tem um método ToString(). Por exemplo, new DateTime(2019, 5, 23).ToString() renderiza "05/23/2019 00:00:00" (em uma thread com cultura dos EUA, veja abaixo). Existem situações, como a concatenação de strings, em que esse método ToString() padrão pode ser invocado implicitamente; "" + new DateTime(2019, 5, 23) dá o mesmo resultado.

Além do método ToString() padrão, os tipos em que a formatação é relevante têm sobrecargas que recebem uma string de formato ou até mesmo um format provider. No BCL (Base Class Library), em particular, esses tipos são números, datas, enums e GUIDs.

Formatação Composta

String.Format() recebe uma string (chamada de formato composto na documentação) composta por texto fixo e espaços reservados (conhecidos na documentação como itens de formato) e um número variável de argumentos. O valor de retorno resolve cada item de formato usando o argumento correspondente e combina os valores resolvidos com o texto fixo.

string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25))
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Format() pode ser uma escolha melhor que a interpolação quando o formato é usado em várias expressões como uma espécie de modelo, ou quando incorporar o formato e as expressões a serem formatadas é muito trabalhoso, como no caso de [verbatim strings][verbatim-strings].

Esse mecanismo é tecnicamente conhecido como formatação composta.

Uma lista mais completa dos métodos que produzem strings e que usam formatação composta está neste artigo.

Interpolação de Strings

As strings interpoladas têm o prefixo $ e incluem expressões avaliadas em tempo de execução entre chaves. O item de formato tem a seguinte sintaxe: $"{<interpolationExpression>[,<alignment>][:<formatString>]}". Eles eliminam a necessidade de uma lista separada de argumentos. O resultado é funcionalmente equivalente ao mecanismo String.Format().

A expressão pode conter qualquer coisa no escopo. O alinhamento é o comprimento do "campo" no qual o texto fica. Se o alinhamento for positivo, o texto é preenchido com espaços à esquerda; se for negativo, o preenchimento fica à direita do texto.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Itens de Formato

O texto entre chaves, os espaços reservados no caso do formato composto e as expressões interpoladas no caso da interpolação de strings é conhecido como item de formato.

Um item de formato pode ser composto por até 3 partes. A primeira é a expressão ou o espaço reservado de argumento obrigatório, como visto no código de exemplo acima. Além disso, há um alinhamento opcional (introduzido com uma vírgula, ",") e uma string de formato opcional (introduzida com dois-pontos, ":").

{<interpolationExpression>[,<alignment>][:<formatString>]}

O alinhamento especifica o comprimento do "campo" no qual o texto é colocado, preenchido com espaços à esquerda se o alinhamento for positivo, ou à direita se for negativo.

A string de formato especifica a forma do texto de saída, como incluir separadores de milhar para um número ou exibir apenas a parte da data de um objeto DateTime.

O código a seguir ilustra a exibição da parte da data de um objeto DateTime e de um número de ponto flutuante em forma exponencial.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

string.Format(
    "I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
    loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

Existe formatação padrão e personalizada tanto para números quanto para datas. Não há diferença crucial entre personalizado e padrão, exceto que você tem a chance de compor strings de formato personalizadas a partir de caracteres de formato. "custom", nesse contexto, não tem nada a ver com a interface ICustomFormatter, que é usada ao desenvolver seus próprios formatadores personalizados.

Formatadores e Strings de Formato do BCL

A Base Class Library (BCL) fornece 2 formatadores, DateTimeFormatInfo e NumberFormatInfo, e 6 grupos de strings de formato.

As várias listas de strings de formato estão abaixo:

As strings de formato de Enum e GUID podem ser classificadas como padrão. Embora enum e GUID tenham sobrecargas de ToString() que recebem um IFormatProvider, não está claro que isso faça alguma coisa.

A biblioteca faz uma tentativa de instilar certa consistência nas strings de formato (para além do fato de serem representadas como strings). Esse esforço por consistência aparece nas strings padrão. Na prática, você raramente se importa com a diferença entre strings padrão e personalizadas. Embora seja uma boa ideia, ao implementar formatadores para suas próprias classes, espelhar as strings padrão existentes quando suas classes parecerem pedir isso, você pode tranquilamente ignorar a diferença.

Cultura

Cada thread de execução tem uma cultura padrão, Thread.CurrentThread.CurrentCulture, encapsulada em uma instância de CultureInfo. A cultura da thread determina como datas e números são formatados por padrão, considerando variações regionais como a diferença no formato de data convencional entre o Reino Unido (DD/MM/YYYY) e os Estados Unidos (MM/DD/YYYY).

CultureInfo implementa a interface IFormatProvider, que pode ser passada para certas sobrecargas de String.Format(). Isso pode ser usado para substituir a cultura da thread.

Material de Referência

Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Formatação de strings

A prática está bloqueada

Desbloqueie mais 11 exercícios para praticar Formatação de strings