Share via


Analisi delle stringhe numeriche

Tutti i tipi numerici dispongono di due metodi di analisi statici, Parse e TryParse, che è possibile utilizzare per convertire la rappresentazione di stringa di un numero in un tipo numerico. Questi metodi consentono di analizzare le stringhe che sono state generate mediante le stringhe di formato descritte in Stringhe di formato numerico standard e Stringhe di formato numerico personalizzate. Per impostazione predefinita, i metodi TryParse e Parse possono essere utilizzati per convertire correttamente le stringhe contenenti solo cifre decimali integrali in valori integer. Consentono di convertire correttamente le stringhe contenenti cifre decimali integrali e frazionarie, separatori di gruppi e un separatore decimale in valori a virgola mobile. Se l'operazione ha esito negativo, il metodo Parse genera un'eccezione, mentre il metodo TryParse restituisce false.

Analisi e provider di formato

In genere, le rappresentazioni di stringa di valori numerici differiscono in base alle impostazioni cultura. Gli elementi delle stringhe numeriche, ad esempio simboli di valuta, separatori di gruppi (o migliaia) e separatori decimali, variano tutti in base alle impostazioni cultura. I metodi di analisi sia in modo implicito che in modo esplicito utilizzano un provider di formato che riconosce tali variazioni specifiche delle impostazioni cultura. Se in una chiamata al metodo TryParse o Parse non viene specificato alcun provider di formato, viene utilizzato il provider di formato associato alle impostazioni cultura del thread corrente, ovvero l'oggetto NumberFormatInfo restituito dalla proprietà NumberFormatInfo.CurrentInfo.

Un provider di formato è rappresentato da un'implementazione di IFormatProvider. Questa interfaccia dispone di un singolo membro, il metodo GetFormat, il cui unico parametro è un oggetto Type che rappresenta il tipo da formattare. Questo metodo restituisce l'oggetto che fornisce le informazioni sulla formattazione. .NET Framework supporta le seguenti due implementazioni di IFormatProvider per analizzare le stringhe numeriche:

Nell'esempio seguente si tenta di convertire ogni stringa di una matrice in un valore Double. Viene innanzitutto tentata l'analisi della stringa utilizzando un provider di formato che riflette le convenzioni delle impostazioni cultura inglesi (Stati Uniti). Se l'operazione genera un'eccezione FormatException, viene tentata l'analisi della stringa utilizzando un provider di formato che riflette le convenzioni delle impostazioni cultura francesi (Francia).

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'.

Analisi e valori NumberStyles

Gli elementi di stile, ad esempio spazio vuoto, separatori di gruppi e separatore decimale, che possono essere gestiti dall'operazione di analisi vengono definiti da un valore di enumerazione NumberStyles. Per impostazione predefinita, le stringhe che rappresentano i valori integer vengono analizzate utilizzando il valore NumberStyles.Integer, che consente solo cifre numeriche, gli spazi iniziale e finale e un segno iniziale. Le stringhe che rappresentano i valori a virgola mobile vengono analizzate utilizzando una combinazione dei valori NumberStyles.Float e NumberStyles.AllowThousands. Questo stile composto consente cifre decimali con spazi iniziale e finale, un segno iniziale, un separatore decimale, un separatore di gruppi e un esponente. Chiamando un overload del metodo TryParse o Parse che include un parametro di tipo NumberStyles e impostando uno o più flag NumberStyles, è possibile controllare gli elementi di stile che possono essere presenti nella stringa affinché l'operazione di analisi abbia esito positivo.

Ad esempio, una stringa contenente un separatore di gruppi non può essere convertita in un valore Int32 utilizzando il metodo Int32.Parse(String). Tuttavia, la conversione avrà esito positivo se si utilizza il flag NumberStyles.AllowThousands, come illustrato nell'esempio seguente.

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
Nota di avvisoAttenzione

L'operazione di analisi utilizza sempre le convenzioni di formattazione delle impostazioni cultura specifiche.Se non vengono specificate impostazioni cultura passando un oggetto CultureInfo o NumberFormatInfo, verranno utilizzate le impostazioni cultura associate al thread corrente.

Nella tabella seguente sono elencati i membri dell'enumerazione NumberStyles e viene descritto l'effetto che hanno sull'operazione di analisi.

Valore NumberStyles

Effetto sulla stringa da analizzare

NumberStyles.None

Solo consentite solo cifre numeriche.

NumberStyles.AllowDecimalPoint

Sono consentiti il separatore decimale e cifre frazionarie. Per i valori integer è consentito solo lo zero come cifra frazionaria. I separatori decimali validi sono determinati dalla proprietà NumberFormatInfo.CurrencyDecimalSeparator o NumberFormatInfo.NumberDecimalSeparator.

NumberStyles.AllowExponent

È possibile utilizzare il carattere "e" o "E" per indicare la notazione esponenziale. Per ulteriori informazioni, vedere NumberStyles.

NumberStyles.AllowLeadingWhite

È consentito lo spazio iniziale.

NumberStyles.AllowTrailingWhite

È consentito lo spazio finale.

NumberStyles.AllowLeadingSign

Un segno positivo o negativo può precedere le cifre numeriche.

NumberStyles.AllowTrailingSign

Un segno positivo o negativo può seguire le cifre numeriche.

NumberStyles.AllowParentheses

È possibile utilizzare le parentesi per indicare valori negativi.

NumberStyles.AllowThousands

È consentito il separatore di gruppi. Il carattere separatore di gruppi è determinato dalla proprietà NumberFormatInfo.CurrencyGroupSeparator o NumberFormatInfo.NumberGroupSeparator.

NumberStyles.AllowCurrencySymbol

È consentito il simbolo di valuta. Il simbolo di valuta è definito dalla proprietà NumberFormatInfo.CurrencySymbol.

NumberStyles.AllowHexSpecifier

La stringa da analizzare viene interpretata come numero esadecimale. È possibile includere le cifre esadecimali 0-9, A-F e a-f. Questo flag può essere utilizzato solo per analizzare i valori integer.

Inoltre, l'enumerazione NumberStyles fornisce i seguenti stili compositi, che includono più flag NumberStyles.

Valore NumberStyles composito

Membri inclusi

NumberStyles.Integer

Include gli stili NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite e NumberStyles.AllowLeadingSign. Si tratta dello stile predefinito utilizzato per analizzare i valori integer.

NumberStyles.Number

Include gli stili NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint e NumberStyles.AllowThousands.

NumberStyles.Float

Include gli stili NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint e NumberStyles.AllowExponent.

NumberStyles.Currency

Include tutti gli stili tranne NumberStyles.AllowExponent e NumberStyles.AllowHexSpecifier.

NumberStyles.Any

Include tutti gli stili tranne NumberStyles.AllowHexSpecifier.

NumberStyles.HexNumber

Include gli stili NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite e NumberStyles.AllowHexSpecifier.

Analisi e cifre Unicode

Lo standard Unicode definisce gli elementi di codice per le cifre in diversi sistemi di scrittura. Ad esempio, gli elementi di codice compresi tra U+0030 e U+0039 rappresentano le cifre latine di base da 0 a 9, gli elementi di codice compresi tra U+09E6 e U+09EF rappresentano le cifre Bengali da 0 a 9 e gli elementi di codice compresi tra U+FF10 e U+FF19 rappresentano le cifre Fullwidth da 0 a 9. Tuttavia, le uniche cifre numeriche riconosciute dai metodi di analisi sono le cifre latine di base da 0 a 9 con gli elementi di codice compresi tra U+0030 e U+0039. Se a un metodo di analisi numerico viene passata una stringa che contiene altre cifre, il metodo genera un'eccezione FormatException.

Nell'esempio seguente viene utilizzato il metodo Int32.Parse per analizzare le stringhe costituite da cifre in diversi sistemi di scrittura. Come illustrato nell'output dell'esempio, il tentativo di analizzare le cifre latine di base ha esito positivo, mentre il tentativo di analisi delle cifre Fullwidth, indoarabiche e Bengali ha esito negativo.

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 '১২৩৪৫'.

Vedere anche

Riferimenti

NumberStyles

Concetti

Formattazione dei tipi di dati

Altre risorse

Analisi delle stringhe

Cronologia delle modifiche

Data

Cronologia

Motivo

Agosto 2010

Rivisto in modo esteso.

Miglioramento delle informazioni.