Analisando sequências de caracteres numéricas
Todos os tipos numéricos têm dois métodos de análise estáticos, Parse e TryParse, que pode ser usado para converter a representação de seqüência de caracteres de um número em um tipo numérico. Esses métodos permitem analisar cadeias de caracteres que foram produzidas usando as seqüências de caracteres de formato documentadas no Sequências de Caracteres de Formato Numérico Padrão e Sequências de Caracteres de Formato Numérico Personalizado. Por padrão, o Parse e TryParse métodos com êxito podem converter seqüências de caracteres que contêm integrais dígitos decimais somente para valores de inteiro. Eles com êxito podem converter seqüências que contêm um separador decimal para valores de ponto flutuante de integrais e fracionários de dígitos decimais e separadores de grupo. O Parse método lança uma exceção se a operação falhar, enquanto o TryParse método retorna false.
Análise e provedores de formato
Normalmente, as representações de seqüência de valores numéricos diferem por cultura. Elementos de separadores de seqüências de caracteres numéricos, como símbolos de moeda, o grupo (ou milhares), separadores decimais e símbolos de moeda variam de acordo com a cultura. Métodos de análise implicitamente ou explicitamente use um provedor de formato reconhece essas variações específicas de cultura. Se nenhum provedor de formato é especificado em uma chamada para o Parse ou TryParse método, o provedor de formato associado com a cultura do thread atual (o NumberFormatInfo objeto retornado pela NumberFormatInfo.CurrentInfo propriedade) é usado.
Um provedor de formato é representado por um IFormatProvider de implementação. Essa interface possui um único membro, o GetFormat método, cujo único parâmetro é um Type o objeto que representa o tipo a ser formatado. Esse método retorna o objeto que fornece informações de formatação. A.NET Framework oferece suporte a dois seguintes IFormatProvider implementações para analisar cadeias de caracteres numéricas:
A CultureInfo objeto cuja CultureInfo.GetFormat método retorna um NumberFormatInfo objeto que fornece informações de formatação específicas da cultura.
A NumberFormatInfo objeto cuja NumberFormatInfo.GetFormat método retorna a mesmo.
O exemplo a seguir tenta converter cada cadeia de caracteres de uma matriz a uma Double valor. Primeiro, ele tenta analisar a cadeia de caracteres usando um provedor de formato que reflete as convenções da cultura inglês (Estados Unidos). Se esta operação lança um FormatException, ele tenta analisar a cadeia de caracteres usando um provedor de formato que reflete as convenções da cultura Francês (França).
Imports System.Globalization
Module Example
Public Sub Main()
Dim values() As String = { "1,304.16", "$1,456.78", "1,094", "152",
"123,45 €", "1 304,16", "Ae9f" }
Dim number As Double
Dim culture As CultureInfo = Nothing
For Each value As String In values
Try
culture = CultureInfo.CreateSpecificCulture("en-US")
number = Double.Parse(value, culture)
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number)
Catch e As FormatException
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value)
culture = CultureInfo.CreateSpecificCulture("fr-FR")
Try
number = Double.Parse(value, culture)
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number)
Catch ex As FormatException
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value)
End Try
End Try
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' en-US: 1,304.16 --> 1304.16
'
' en-US: Unable to parse '$1,456.78'.
' fr-FR: Unable to parse '$1,456.78'.
'
' en-US: 1,094 --> 1094
'
' en-US: 152 --> 152
'
' en-US: Unable to parse '123,45 €'.
' fr-FR: Unable to parse '123,45 €'.
'
' en-US: Unable to parse '1 304,16'.
' fr-FR: 1 304,16 --> 1304.16
'
' en-US: Unable to parse 'Ae9f'.
' fr-FR: Unable to parse 'Ae9f'.
' ' The example displays the following output:
' en-US: 1,304.16 --> 1304.16
'
' en-US: Unable to parse '$1,456.78'.
' fr-FR: Unable to parse '$1,456.78'.
'
' en-US: 1,094 --> 1094
'
' en-US: 152 --> 152
'
' en-US: Unable to parse '123,45 €'.
' fr-FR: Unable to parse '123,45 €'.
'
' en-US: Unable to parse '1 304,16'.
' fr-FR: 1 304,16 --> 1304.16
'
' en-US: Unable to parse 'Ae9f'.
' fr-FR: Unable to parse 'Ae9f'.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string[] values = { "1,304.16", "$1,456.78", "1,094", "152",
"123,45 €", "1 304,16", "Ae9f" };
double number;
CultureInfo culture = null;
foreach (string value in values) {
try {
culture = CultureInfo.CreateSpecificCulture("en-US");
number = Double.Parse(value, culture);
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number);
}
catch (FormatException) {
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value);
culture = CultureInfo.CreateSpecificCulture("fr-FR");
try {
number = Double.Parse(value, culture);
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number);
}
catch (FormatException) {
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value);
}
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// en-US: 1,304.16 --> 1304.16
//
// en-US: Unable to parse '$1,456.78'.
// fr-FR: Unable to parse '$1,456.78'.
//
// en-US: 1,094 --> 1094
//
// en-US: 152 --> 152
//
// en-US: Unable to parse '123,45 €'.
// fr-FR: Unable to parse '123,45 €'.
//
// en-US: Unable to parse '1 304,16'.
// fr-FR: 1 304,16 --> 1304.16
//
// en-US: Unable to parse 'Ae9f'.
// fr-FR: Unable to parse 'Ae9f'.
Análise e valores de NumberStyles
Os elementos de estilo (como, por exemplo, espaço em branco, separadores de grupo e o separador decimal) que pode manipular a operação de análise são definidos por uma NumberStyles valor de enumeração. Por padrão, as seqüências de caracteres que representam valores inteiros são analisadas usando o NumberStyles.Integer valor, que permite que os dígitos numéricos somente, à esquerda e espaços em branco e um sinal à esquerda. Seqüências de caracteres que representam os valores de ponto flutuante são analisadas usando uma combinação da NumberStyles.Float e NumberStyles.AllowThousands valores; Esse estilo composto permite que os dígitos decimais junto com o espaço em branco à direita e à esquerda, um sinal à esquerda, um separador decimal, um separador de grupo e um expoente. Chamando uma sobrecarga de Parse ou TryParse que inclui um parâmetro do tipo de método NumberStyles e configuração de um ou mais NumberStyles sinalizadores, você pode controlar os elementos de estilo que podem estar presentes na seqüência de caracteres para a operação de análise para o sucesso.
Por exemplo, uma seqüência de caracteres que contém um separador de grupo não pode ser convertida para um Int32 valor usando o Int32.Parse(String) método, no entanto, a conversão for bem-sucedida se você usar o NumberStyles.AllowThousands sinalizador, como o exemplo a seguir ilustra.
Imports System.Globalization
Module Example
Public Sub Main()
Dim value As String = "1,304"
Dim number As Integer
Dim provider As IFormatProvider = CultureInfo.CreateSpecificCulture("en-US")
If Int32.TryParse(value, number) Then
Console.WriteLine("{0} --> {1}", value, number)
Else
Console.WriteLine("Unable to convert '{0}'", value)
End If
If Int32.TryParse(value, NumberStyles.Integer Or NumberStyles.AllowThousands,
provider, number) Then
Console.WriteLine("{0} --> {1}", value, number)
Else
Console.WriteLine("Unable to convert '{0}'", value)
End If
End Sub
End Module
' The example displays the following output:
' Unable to convert '1,304'
' 1,304 --> 1304
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string value = "1,304";
int number;
IFormatProvider provider = CultureInfo.CreateSpecificCulture("en-US");
if (Int32.TryParse(value, out number))
Console.WriteLine("{0} --> {1}", value, number);
else
Console.WriteLine("Unable to convert '{0}'", value);
if (Int32.TryParse(value, NumberStyles.Integer | NumberStyles.AllowThousands,
provider, out number))
Console.WriteLine("{0} --> {1}", value, number);
else
Console.WriteLine("Unable to convert '{0}'", value);
}
}
// The example displays the following output:
// Unable to convert '1,304'
// 1,304 --> 1304
Cuidado |
---|
A operação de análise sempre usa as convenções de formatação de uma determinada cultura.Se você não especificar uma cultura, passando um CultureInfo ou NumberFormatInfo o objeto, a cultura associada ao thread atual é usada. |
A tabela a seguir lista os membros de na NumberStyles enumeração e descreve o efeito que eles têm na operação de análise.
Valor NumberStyles |
Efeito sobre a seqüência de caracteres a ser analisado. |
---|---|
Somente os dígitos numéricos são permitidos. |
|
O separador decimal e dígitos fracionais são permitidos. Para valores inteiros, somente zero é permitido como um dígito fracionário. Os separadores decimais válidos são determinados pelo NumberFormatInfo.NumberDecimalSeparator ou NumberFormatInfo.CurrencyDecimalSeparator propriedade. |
|
O "e" ou "E" caractere pode ser usado para indicar a notação exponencial. Consulte NumberStyles para obter informações adicionais. |
|
Espaço em branco é permitido. |
|
À direita de espaço em branco é permitida. |
|
Um sinal positivo ou negativo pode preceder dígitos numéricos. |
|
Um sinal positivo ou negativo pode seguir os dígitos numéricos. |
|
Parênteses podem ser usados para indicar valores negativos. |
|
O separador de grupo é permitido. O caractere separador de grupo é determinado pelo NumberFormatInfo.NumberGroupSeparator ou NumberFormatInfo.CurrencyGroupSeparator propriedade. |
|
O símbolo da moeda é permitido. O símbolo de moeda é definido pela NumberFormatInfo.CurrencySymbol propriedade. |
|
A seqüência de caracteres a ser analisado é interpretada como um número hexadecimal. Pode incluir os dígitos hexadecimais de 0-9, A-F e a-f. Esse sinalizador pode ser usado somente para analisar os valores inteiros. |
Além disso, o NumberStyles enumeração fornece os seguintes estilos de composição, que incluem vários NumberStyles sinalizadores.
Valor de NumberStyles composto |
Inclui membros |
---|---|
Inclui o NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, e NumberStyles.AllowLeadingSign estilos. Este é o estilo padrão usado para analisar os valores inteiros. |
|
Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowThousands styles. |
|
Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowExponent styles. |
|
Inclui todos os estilos, exceto NumberStyles.AllowExponent e NumberStyles.AllowHexSpecifier. |
|
Inclui todos os estilos, exceto NumberStyles.AllowHexSpecifier. |
|
Inclui o NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, e NumberStyles.AllowHexSpecifier estilos. |
Análise e dígitos Unicode
O padrão Unicode define pontos de código para dígitos nos vários sistemas de escrita. Por exemplo, pontos de código de U + 0030 U + 0039 representam os dígitos de latino básicos de 0 a 9, pontos de código de U + 09E6 U + 09EF representam os Bengali dígitos de 0 a 9 e pontos de código de U + FF10 U + FF19 representam os largura total dígitos de 0 a 9. Entretanto, os dígitos numéricos somente reconhecidos pelos métodos de análise são os dígitos 0-9 Latino básicos com pontos de código de U + 0030 U + 0039. Se um método de análise de numérico for passado em uma seqüência de caracteres que contém quaisquer outros dígitos, o método lança um FormatException.
O exemplo a seguir usa a Int32.Parse escrevendo de método para analisar cadeias de caracteres que consistem em dígitos em diferentes sistemas. Como mostra a saída do exemplo, a tentativa de análise, os dígitos latino básicos for bem-sucedida, mas a tentativa de analisar a largura total,-arábico e Bengali dígitos falhar.
Module Example
Public Sub Main()
Dim value As String
' Define a string of basic Latin digits 1-5.
value = ChrW(&h31) + ChrW(&h32) + ChrW(&h33) + ChrW(&h34) + ChrW(&h35)
ParseDigits(value)
' Define a string of Fullwidth digits 1-5.
value = ChrW(&hff11) + ChrW(&hff12) + ChrW(&hff13) + ChrW(&hff14) + ChrW(&hff15)
ParseDigits(value)
' Define a string of Arabic-Indic digits 1-5.
value = ChrW(&h661) + ChrW(&h662) + ChrW(&h663) + ChrW(&h664) + ChrW(&h665)
ParseDigits(value)
' Define a string of Bengali digits 1-5.
value = ChrW(&h09e7) + ChrW(&h09e8) + ChrW(&h09e9) + ChrW(&h09ea) + ChrW(&h09eb)
ParseDigits(value)
End Sub
Sub ParseDigits(value As String)
Try
Dim number As Integer = Int32.Parse(value)
Console.WriteLine("'{0}' --> {1}", value, number)
Catch e As FormatException
Console.WriteLine("Unable to parse '{0}'.", value)
End Try
End Sub
End Module
' The example displays the following output:
' '12345' --> 12345
' Unable to parse '12345'.
' Unable to parse '١٢٣٤٥'.
' Unable to parse '১২৩৪৫'.
using System;
public class Example
{
public static void Main()
{
string value;
// Define a string of basic Latin digits 1-5.
value = "\u0031\u0032\u0033\u0034\u0035";
ParseDigits(value);
// Define a string of Fullwidth digits 1-5.
value = "\uFF11\uFF12\uFF13\uFF14\uFF15";
ParseDigits(value);
// Define a string of Arabic-Indic digits 1-5.
value = "\u0661\u0662\u0663\u0664\u0665";
ParseDigits(value);
// Define a string of Bengali digits 1-5.
value = "\u09e7\u09e8\u09e9\u09ea\u09eb";
ParseDigits(value);
}
static void ParseDigits(string value)
{
try {
int number = Int32.Parse(value);
Console.WriteLine("'{0}' --> {1}", value, number);
}
catch (FormatException) {
Console.WriteLine("Unable to parse '{0}'.", value);
}
}
}
// The example displays the following output:
// '12345' --> 12345
// Unable to parse '12345'.
// Unable to parse '١٢٣٤٥'.
// Unable to parse '১২৩৪৫'.
Consulte também
Referência
Conceitos
Outros recursos
Analisando sequências de caracteres
Histórico de alterações
Date |
History |
Motivo |
---|---|---|
Agosto de 2010 |
Revisado exaustivamente. |
Aprimoramento de informações. |