C# - Formatação com interpolação de strings


 Hoje veremos como formatar strings usando o recurso da interpolação de strings da linguagem C#.

A interpolação de strings esta disponível a partir da versão  6.0 do C# e é usada prefixando a string com um caractere $.  Assim este caractere especial identifica um literal string como uma cadeia de strings interpolada.

As strings interpoladas têm a seguinte estrutura:  $"{variável: formato}"

Normalmente o formato não é usado, e, então a forma mais usual se parece com : $"{variavel}"

Exemplo: Meu nome é {nome}”.

Abaixo temos um exemplo comparando a concatenação de strings com o recurso interpolação de strings:

Nota: Este código esta usando o recurso Top Level Statements do C# 9.

A linha de código : Console.WriteLine(nome + " tem " + idade + " anos de idade");

Usa a maneira tradicional, concatenando strings e usando as duas variáveis nome e idade.

Na linha de código : Console.WriteLine($"{nome} tem {idade} anos de idade");

Estamos usando a interpolação de string que permite injetar variáveis diretamente na string, cercando-a com chaves {}. E mesmo que isso aconteça dentro de uma string, o compilador irá verificar as variáveis que você está tentando injetar!

Além disso podemos usar propriedades de objetos complexos, da mesma forma que faria se estivesse fazendo uma concatenação regular de strings. Exemplo:

Vejamos agora alguns exemplo de uso deste recurso onde vamos aplicar também a formatação das strings.

Interpolação de strings com formatação

Vamos iniciar formatando um valor decimal:

Resultado:

Note que a formatação usa a moeda local e esta sendo feita levando em conta a cultura local definida no ambiente do meu Windows 10.

Este código seria equivalente a : Console.WriteLine(string.Format("{0:C}", valor));

Na verdade, usar a interpolação de strings ao invés de usar  string.format quer seja no formato padrão ou no formato personalizado. A única coisa um pouco diferente é como você especifica a cultura.

Especificando a cultura

Como já vimos a interpolação de strings usa como padrão a cultura atual. Se você deseja especificar a cultura, você deve converter a string interpolada como uma FormattableString, então chamar .ToString() nela e passar a cultura.

Exemplo:

using System.Globalization;

decimal valor = 10.2322m;

//mais de um alinha
FormattableString ft = $"valor: {valor:C}";
var resultado = ft.ToString(CultureInfo.GetCultureInfo("en-GB"));
Console.WriteLine(resultado);

//usando apenas uma linha
Console.WriteLine(((FormattableString)$"valor do pedido: {valor:C}")
                                .ToString(CultureInfo.GetCultureInfo("en-GB")));

Console.WriteLine(string.Format(CultureInfo.GetCultureInfo("en-GB"), "Valor : {0:C}", valor));

Console.ReadKey();

No código acima estamos definindo a cultura en-GB e realizando a formatação usando o formato com mais de uma linha e o mesmo código usando apenas uma linha.

Resultado:

Usando string.Format o código poderia ser usado assim:

Console.WriteLine(string.Format(CultureInfo.GetCultureInfo("en-GB"), "Valor : {0:C}", valor));

Aqui o código ficou mais sucinto que na interpolação de strings.

Usando outros formatos

Podemos usar usar qualquer sequência de formato padrão ou sequência de formato personalizado com interpolação de strings.

Vejamos a seguir alguns exemplos:

decimal valor = 10.2322m;
Console.WriteLine($"Exibindo 3 casasdecimais: {valor:0.###}");

DateTime agora = DateTime.Now;
Console.WriteLine($"Hora atual: {agora:h:mm:ss tt K}");

long telefone = 5555555555;
Console.WriteLine($"Telefone: {telefone:(###) ###-####}");

Console.ReadKey();

Resultado:

1- O formato personalizado para mostrar os últimos 3 decimais de um número:

Console.WriteLine($"Exibindo 3 casasdecimais: {valor:0.###}");

2- Exibir a hora atual, incluindo a diferença de fuso horário :

Console.WriteLine($"Hora atual: {agora:h:mm:ss tt K}");

Para exibir a data em outro formato podemos fazer assim:

Console.WriteLine($"Hoje é : {DateTime.Now:dd-MM-yyyy}");

3- A exibição do número de telefone em um formato específico:

Console.WriteLine($"Telefone: {telefone:(###) ###-####}");

Indo além de variáveis

Na interpolação de strings também podemos ter expressões C# inteiras dentro de suas strings, desde que elas resultem em algo que possa ser anexado a uma string.

Um bom exemplo disso é quando temos que fazer a avaliação de uma expressão para exibir uma string.

No exemplo a seguir estamos avaliando se idade é maior que 21 e neste caso exibimos a string 'maior' , e , caso contrário exibimos a string 'menor:

Observe como incluímos uma instrução if-then-else , usando o operador ternário, na string, dentro de um conjunto de parênteses. Podemos fazer isso porque o resultado da expressão é uma string.

Resultado:

Com base nisso também podemos avaliar uma expressão matemática:

Console.WriteLine($"50 + 5 * 12 = {50 + 5 * 12}");

Isso é possível desde que o resultado da expressão possa ser transformado em uma string.

E estamos conversados...

"Vai alta a noite, e vem chegando o dia. Deixemos, pois, as obras das trevas e revistamo-nos das armas da luz.
Andemos dignamente, como em pleno dia, não em orgias e bebedices, não em impudicícias e dissoluções, não em contendas e ciúmes; mas revesti-vos do Senhor Jesus Cristo e nada disponhais para a carne no tocante às suas concupiscências."

Romanos 13:12-14

Referências:


José Carlos Macoratti