Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O .NET oferece amplo controle sobre a representação de cadeia de caracteres de valores numéricos. Ele suporta os seguintes recursos para personalizar o formato de valores numéricos:
Cadeias de caracteres de formato numérico padrão, que fornecem um conjunto predefinido de formatos para converter números em sua representação de cadeia de caracteres. Você pode usá-los com qualquer método de formatação numérica, como Decimal.ToString(String), que tenha um
formatparâmetro. Para obter detalhes, consulte Cadeias de caracteres de formato numérico padrão.Cadeias de caracteres de formato numérico personalizadas, que fornecem um conjunto de símbolos que podem ser combinados para definir especificadores de formato numérico personalizados. Eles também podem ser usados com qualquer método de formatação numérica, como Decimal.ToString(String), que tenha um
formatparâmetro. Para obter detalhes, consulte Cadeias de caracteres de formato numérico personalizadas.Personalizado CultureInfo ou NumberFormatInfo objetos, que definem os símbolos e padrões de formato usados na exibição das representações de cadeia de caracteres de valores numéricos. Você pode usá-los com qualquer método de formatação numérica, como ToString, que tenha um
providerparâmetro. Normalmente, o parâmetro é usado para especificar aproviderformatação específica da cultura.
Em alguns casos (como quando um aplicativo deve exibir um número de conta formatado, um número de identificação ou um código postal), essas três técnicas são inadequadas. O .NET também permite que você defina um objeto de formatação que não é nem um CultureInfo objeto nem um NumberFormatInfo objeto para determinar como um valor numérico é formatado. Este tópico fornece as instruções passo a passo para implementar esse objeto e fornece um exemplo que formata números de telefone.
Definir um provedor de formato personalizado
Defina uma classe que implemente as IFormatProvider interfaces e ICustomFormatter .
Implemente o IFormatProvider.GetFormat método. GetFormat é um método de retorno de chamada que o método de formatação (como o String.Format(IFormatProvider, String, Object[]) método) invoca para recuperar o objeto que é realmente responsável por executar a formatação personalizada. Uma implementação típica de GetFormat faz o seguinte:
Determina se o Type objeto passado como um parâmetro de método representa uma ICustomFormatter interface.
Se o parâmetro representar a ICustomFormatter interface, GetFormat retorna um objeto que implementa a ICustomFormatter interface responsável por fornecer formatação personalizada. Normalmente, o objeto de formatação personalizado retorna a si mesmo.
Se o parâmetro não representar a ICustomFormatter interface, GetFormat retornará
null.
Implemente o Format método. Esse método é chamado pelo String.Format(IFormatProvider, String, Object[]) método e é responsável por retornar a representação de cadeia de caracteres de um número. A implementação do método normalmente envolve o seguinte:
Opcionalmente, certifique-se de que o método se destina legitimamente a fornecer serviços de formatação examinando o
providerparâmetro. Para formatar objetos que implementam ambos e IFormatProvider ICustomFormatter, isso envolve testar oproviderparâmetro para igualdade com o objeto de formatação atual.Determine se o objeto de formatação deve oferecer suporte a especificadores de formato personalizados. (Por exemplo, um especificador de formato "N" pode indicar que um número de telefone dos EUA deve ser emitido no formato NANP e um "I" pode indicar saída no formato E.123 da Recomendação E.123 da UIT.) Se forem utilizados especificadores de formato, o método deve tratar o especificador de formato específico. Ele é passado para o método no
formatparâmetro. Se nenhum especificador estiver presente, oformatvalor do parâmetro é String.Empty.Recupere o valor numérico passado para o método como o
argparâmetro. Execute as manipulações necessárias para convertê-lo em sua representação de cadeia de caracteres.Retornar a representação de cadeia de caracteres do
argparâmetro.
Usar um objeto de formatação numérica personalizado
Crie uma nova instância da classe de formatação personalizada.
Chame o String.Format(IFormatProvider, String, Object[]) método de formatação, passando-lhe o objeto de formatação personalizado, o especificador de formatação (ou String.Empty, se não for usado) e o valor numérico a ser formatado.
Exemplo
O exemplo a seguir define um provedor de formato numérico personalizado chamado TelephoneFormatter que converte um número que representa um número de telefone dos EUA para seu formato NANP ou E.123. O método manipula dois especificadores de formato, "N" (que produz o formato NANP) e "I" (que produz o formato internacional E.123).
using System;
using System.Globalization;
public class TelephoneFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
// Check whether this is an appropriate callback
if (! this.Equals(formatProvider))
return null;
// Set default format specifier
if (string.IsNullOrEmpty(format))
format = "N";
string numericString = arg.ToString();
if (format == "N")
{
if (numericString.Length <= 4)
return numericString;
else if (numericString.Length == 7)
return numericString.Substring(0, 3) + "-" + numericString.Substring(3, 4);
else if (numericString.Length == 10)
return "(" + numericString.Substring(0, 3) + ") " +
numericString.Substring(3, 3) + "-" + numericString.Substring(6);
else
throw new FormatException(
string.Format("'{0}' cannot be used to format {1}.",
format, arg.ToString()));
}
else if (format == "I")
{
if (numericString.Length < 10)
throw new FormatException(string.Format("{0} does not have 10 digits.", arg.ToString()));
else
numericString = "+1 " + numericString.Substring(0, 3) + " " + numericString.Substring(3, 3) + " " + numericString.Substring(6);
}
else
{
throw new FormatException(string.Format("The {0} format specifier is invalid.", format));
}
return numericString;
}
}
public class TestTelephoneFormatter
{
public static void Main()
{
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 0));
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 911));
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 8490216));
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 4257884748));
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 0));
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 911));
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 8490216));
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 4257884748));
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:I}", 4257884748));
}
}
Public Class TelephoneFormatter : Implements IFormatProvider, ICustomFormatter
Public Function GetFormat(formatType As Type) As Object _
Implements IFormatProvider.GetFormat
If formatType Is GetType(ICustomFormatter) Then
Return Me
Else
Return Nothing
End If
End Function
Public Function Format(fmt As String, arg As Object, _
formatProvider As IFormatProvider) As String _
Implements ICustomFormatter.Format
' Check whether this is an appropriate callback
If Not Me.Equals(formatProvider) Then Return Nothing
' Set default format specifier
If String.IsNullOrEmpty(fmt) Then fmt = "N"
Dim numericString As String = arg.ToString
If fmt = "N" Then
Select Case numericString.Length
Case <= 4
Return numericString
Case 7
Return Left(numericString, 3) & "-" & Mid(numericString, 4)
Case 10
Return "(" & Left(numericString, 3) & ") " & _
Mid(numericString, 4, 3) & "-" & Mid(numericString, 7)
Case Else
Throw New FormatException( _
String.Format("'{0}' cannot be used to format {1}.", _
fmt, arg.ToString()))
End Select
ElseIf fmt = "I" Then
If numericString.Length < 10 Then
Throw New FormatException(String.Format("{0} does not have 10 digits.", arg.ToString()))
Else
numericString = "+1 " & Left(numericString, 3) & " " & Mid(numericString, 4, 3) & " " & Mid(numericString, 7)
End If
Else
Throw New FormatException(String.Format("The {0} format specifier is invalid.", fmt))
End If
Return numericString
End Function
End Class
Public Module TestTelephoneFormatter
Public Sub Main
Console.WriteLine(String.Format(New TelephoneFormatter, "{0}", 0))
Console.WriteLine(String.Format(New TelephoneFormatter, "{0}", 911))
Console.WriteLine(String.Format(New TelephoneFormatter, "{0}", 8490216))
Console.WriteLine(String.Format(New TelephoneFormatter, "{0}", 4257884748))
Console.WriteLine(String.Format(New TelephoneFormatter, "{0:N}", 0))
Console.WriteLine(String.Format(New TelephoneFormatter, "{0:N}", 911))
Console.WriteLine(String.Format(New TelephoneFormatter, "{0:N}", 8490216))
Console.WriteLine(String.Format(New TelephoneFormatter, "{0:N}", 4257884748))
Console.WriteLine(String.Format(New TelephoneFormatter, "{0:I}", 4257884748))
End Sub
End Module
O provedor de formato numérico personalizado pode ser usado somente com o String.Format(IFormatProvider, String, Object[]) método. As outras sobrecargas de métodos de formatação numérica (como ToString) que têm um parâmetro de tipo IFormatProvider passam a IFormatProvider.GetFormat implementação de um Type objeto que representa o NumberFormatInfo tipo. Em troca, eles esperam que o método retorne um NumberFormatInfo objeto. Se isso não acontecer, o provedor de formato numérico personalizado será ignorado e o NumberFormatInfo objeto para a cultura atual será usado em seu lugar. No exemplo, o TelephoneFormatter.GetFormat método lida com a possibilidade de que ele pode ser passado inadequadamente para um método de formatação numérica examinando o parâmetro do método e retornando null se ele representa um tipo diferente de ICustomFormatter.
Se um provedor de formato numérico personalizado oferecer suporte a um conjunto de especificadores de formato, certifique-se de fornecer um comportamento padrão se nenhum especificador de formato for fornecido no item de formato usado na chamada de String.Format(IFormatProvider, String, Object[]) método. No exemplo, "N" é o especificador de formato padrão. Isso permite que um número seja convertido em um número de telefone formatado, fornecendo um especificador de formato explícito. O exemplo a seguir ilustra essa chamada de método.
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 4257884748));
Console.WriteLine(String.Format(New TelephoneFormatter, "{0:N}", 4257884748))
Mas também permite que a conversão ocorra se nenhum especificador de formato estiver presente. O exemplo a seguir ilustra essa chamada de método.
Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 4257884748));
Console.WriteLine(String.Format(New TelephoneFormatter, "{0}", 4257884748))
Se nenhum especificador de formato padrão for definido, sua implementação do ICustomFormatter.Format método deve incluir código como o seguinte para que o .NET possa fornecer formatação que seu código não suporta.
if (arg is IFormattable)
s = ((IFormattable)arg).ToString(format, formatProvider);
else if (arg != null)
s = arg.ToString();
If TypeOf (arg) Is IFormattable Then
s = DirectCast(arg, IFormattable).ToString(fmt, formatProvider)
ElseIf arg IsNot Nothing Then
s = arg.ToString()
End If
No caso deste exemplo, o método que implementa ICustomFormatter.Format destina-se a servir como um método de retorno de chamada para o String.Format(IFormatProvider, String, Object[]) método. Portanto, ele examina o formatProvider parâmetro para determinar se ele contém uma referência ao objeto atual TelephoneFormatter . No entanto, o método também pode ser chamado diretamente do código. Nesse caso, você pode usar o formatProvider parâmetro para fornecer um CultureInfo ou NumberFormatInfo objeto que forneça informações de formatação específicas da cultura.