Compartilhar via


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:

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
Observação de cuidadoCuidado

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.

NumberStyles.None

Somente os dígitos numéricos são permitidos.

NumberStyles.AllowDecimalPoint

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.

NumberStyles.AllowExponent

O "e" ou "E" caractere pode ser usado para indicar a notação exponencial. Consulte NumberStyles para obter informações adicionais.

NumberStyles.AllowLeadingWhite

Espaço em branco é permitido.

NumberStyles.AllowTrailingWhite

À direita de espaço em branco é permitida.

NumberStyles.AllowLeadingSign

Um sinal positivo ou negativo pode preceder dígitos numéricos.

NumberStyles.AllowTrailingSign

Um sinal positivo ou negativo pode seguir os dígitos numéricos.

NumberStyles.AllowParentheses

Parênteses podem ser usados para indicar valores negativos.

NumberStyles.AllowThousands

O separador de grupo é permitido. O caractere separador de grupo é determinado pelo NumberFormatInfo.NumberGroupSeparator ou NumberFormatInfo.CurrencyGroupSeparator propriedade.

NumberStyles.AllowCurrencySymbol

O símbolo da moeda é permitido. O símbolo de moeda é definido pela NumberFormatInfo.CurrencySymbol propriedade.

NumberStyles.AllowHexSpecifier

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

NumberStyles.Integer

Inclui o NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, e NumberStyles.AllowLeadingSign estilos. Este é o estilo padrão usado para analisar os valores inteiros.

NumberStyles.Number

Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowThousands styles.

NumberStyles.Float

Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowExponent styles.

NumberStyles.Currency

Inclui todos os estilos, exceto NumberStyles.AllowExponent e NumberStyles.AllowHexSpecifier.

NumberStyles.Any

Inclui todos os estilos, exceto NumberStyles.AllowHexSpecifier.

NumberStyles.HexNumber

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

NumberStyles

Conceitos

Tipos de Formatação

Outros recursos

Analisando sequências de caracteres

Histórico de alterações

Date

History

Motivo

Agosto de 2010

Revisado exaustivamente.

Aprimoramento de informações.