Na seção anterior aprendemos os marcadores de posição de string e dois métodos de utilização. Além dessas duas formas, o C# também suporta regras de formatação mais complexas.
Sintaxe básica dos marcadores de formato
{índice,alinhamento:formato}
1. index (índice)
Índice / variável interpolada, campo obrigatório
Marcadores numéricos tradicionais: Console.WriteLine(“{0}”, 123); insere o valor 123 na posição {0}
Interpolação de string com $"": escreva diretamente o nome da variável sem índice numérico, exemplo Console.WriteLine($”Tom is {age} years old”)
Exemplo de código
int money = 1000;
Console.WriteLine("Valor original: {0}", money);
Console.WriteLine("Formato monetário: {0:C}", money);
Console.WriteLine("Moeda alinhada à direita com 10 caracteres: |{0,10:C}|", money);Code language: JavaScript (javascript)
Valor original: 1000
Formato monetário: $1,000.00
Moeda alinhada à direita com 10 caracteres: | $1,000.00|
Versão equivalente com interpolação
int money = 500;
Console.WriteLine($"Valor original: {money}");
Console.WriteLine($"Formato monetário: {money:C}");
Console.WriteLine($"Moeda alinhada à direita com 10 caracteres: |{money,10:C}|");Code language: JavaScript (javascript)
2. alignment (alinhamento)
Especificador de alinhamento, opcional, separado por vírgula ,
Função: controlar a largura mínima da saída e o alinhamento horizontal do conteúdo
Exemplo: Console.WriteLine(“{0,10}”, 123); // Ocupa 10 posições de caractere, número alinhado à direita

Como é possível ver, existem muitos espaços em branco à esquerda do número 123. O número 10 define uma largura total de dez caracteres, ou seja, sete espaços são adicionados antes do 123 para realizar o alinhamento à direita.
Número positivo: alinhamento à direita, preenche espaços à esquerda se a largura for insuficiente Exemplo: {0,10} → largura de 10 caracteres, número à direita
Número negativo: alinhamento à esquerda, preenche espaços à direita se a largura for insuficiente Exemplo: {0,-10} → largura de 10 caracteres, número à esquerda
Vamos alterar o código da seguinte forma
Console.WriteLine("{0,-10}", 123); // Utiliza 10 caracteres, valor negativo significa alinhamento à esquerdaCode language: JavaScript (javascript)

Os espaços vazios são difíceis de visualizar, então adicionamos barras verticais para diferenciá-los
Console.WriteLine("|{0,-10}|", 123);
Console.WriteLine("|{0,10}|", 456);Code language: JavaScript (javascript)

Com os delimitadores verticais o funcionamento fica claro: o valor 10 é uma largura fixa de 10 caracteres, números negativos alinham à esquerda, positivos à direita e os espaços não utilizados são preenchidos com caracteres de espaço.
O código equivalente com interpolação de string segue abaixo
int one = 123;
int two = 456;
Console.WriteLine($"|{one,-10}|");
Console.WriteLine($"|{two,-10}|");Code language: JavaScript (javascript)

3. format (formato)
Campo de formato, opcional, separado por dois pontos :
Controla o estilo de exibição de números: moeda, casas decimais fixas, notação científica, hexadecimal e outros.
Estrutura do campo de formato :Axx
:deve ficar diretamente colado ao marcador sem espaços intermediáriosA: especificador de letra única (9 formatos padrão nativos, alguns diferenciam maiúsculas e minúsculas)xx: especificador de precisão (opcional, 1 a 2 dígitos, seu significado varia conforme o caractere de formato)
// F4: formato de ponto fixo, mantém 4 casas decimais
Console.WriteLine("{0:F4}", 12.345678);
// Escrita equivalente com interpolação
Console.WriteLine($"{12.345678:F4}");Code language: JavaScript (javascript)

Veja mais exemplos práticos
double myDouble = 12.345678;
Console.WriteLine("{0,-10:G} -- Geral", myDouble); // 12.345678 -- Geral
Console.WriteLine("{0,-10} -- Padrão", myDouble); // 12.345678 -- Padrão
Console.WriteLine("{0,-10:F4} -- Ponto Fixo", myDouble); // 12.3457 -- Ponto Fixo
Console.WriteLine("{0,-10:C} -- Monetário", myDouble); // $12.35 -- Monetário
Console.WriteLine("{0,-10:E3} -- Notação Científica", myDouble);//1.235E+001 -- Notação Científica
Console.WriteLine("{0,-10:x} -- Inteiro Hexadecimal", 1194719); // 123adf -- Inteiro HexadecimalCode language: JavaScript (javascript)
Tabela dos 9 especificadores de formato numérico padrão
| Identificador | Nome | Função | Significado da precisão | Exemplo de saída |
|---|---|---|---|---|
| C/c | Currency Moeda | Exibe símbolo monetário regionalizado | Número de casas decimais | {0:C} 12,5 → $12.50 |
| D/d | Decimal Inteiro Decimal | Apenas para tipo int, preenche zeros à esquerda | Mínimo de dígitos visíveis | {0:D4} 12 → 0012 |
| F/f | Fixed-point Ponto Fixo | Quantidade fixa de casas decimais | Casas decimais mantidas | {0:F4} 12,345678 →12.3457 |
| G/g | General Formato Geral | Troca automaticamente ponto fixo ou notação científica, formato padrão | Quantidade de dígitos significativos | {0:G4} 12,345678 →12.35 |
| X/x | Hexadecimal Hexadecimal (diferencia maiúsculas/minúsculas) | Saída hexadecimal, X maiúsculo, x minúsculo | Mínimo de dígitos visíveis | {0:x} 180026 → 2bf3a |
| N/n | Number Número com Separador de Milhares | Separador a cada três dígitos | Número de casas decimais | {0:N2} 12345678,54321 →12,345,678.54 |
| P/p | Percent Porcentagem | Valor ×100 com símbolo % no final | Número de casas decimais | {0:P2} 0,1221897 →12,22 % |
| R/r | Round-trip Formato de Ida e Volta | Permite converter de volta ao número original sem perda de precisão | Parâmetro de precisão ignorado | {0:R} 1234,21897 →1234.21897 |
| E/e | Scientific Notação Científica (diferencia maiúsculas/minúsculas) | Formato exponencial, E maiúsculo, e minúsculo | Casas decimais da mantissa | {0:e4}12,3456789 →1.2346e+001 |
Cadeias de Formatação Numérica