Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Tutti i tipi numerici hanno due metodi di analisi statici, Parse
e TryParse
, che è possibile usare per convertire la rappresentazione di stringa di un numero in un tipo numerico. Questi metodi consentono di analizzare le stringhe generate usando le stringhe di formato documentate in stringhe di formato numerico standard e stringhe di formato numerico personalizzato. Per impostazione predefinita, i metodi Parse
e TryParse
possono convertire correttamente stringhe contenenti cifre decimali integrali solo in valori interi. Possono convertire correttamente stringhe che contengono cifre decimali integrali e frazionarie, separatori di raggruppamento e separatore decimale in valori a virgola mobile. Il metodo Parse
genera un'eccezione se l'operazione non riesce, mentre il metodo TryParse
restituisce false
.
Nota
A partire da .NET 7, i tipi numerici in .NET implementano anche l'interfaccia System.IParsable<TSelf>, che definisce i metodi IParsable<TSelf>.Parse e IParsable<TSelf>.TryParse.
Analisi e fornitori di formato
In genere, le rappresentazioni di stringa di valori numerici differiscono in base alle impostazioni culturali. Gli elementi di stringhe numeriche, come i simboli di moneta, i separatori di gruppo (o delle migliaia) e i separatori decimali, variano in base alle impostazioni culturali. I metodi di analisi usano un provider di formato che riconosce in modo implicito o esplicito queste varianti specifiche culturali. Se non viene specificato alcun provider di formato in una chiamata al metodo Parse
o TryParse
, viene utilizzato il provider di formato associato alle impostazioni cultura correnti (l'oggetto NumberFormatInfo restituito dalla proprietà NumberFormatInfo.CurrentInfo).
Un provider di formato è rappresentato da un'implementazione IFormatProvider. Questa interfaccia ha un singolo membro, il metodo GetFormat, il cui singolo parametro è un oggetto Type che rappresenta il tipo da formattare. Questo metodo restituisce l'oggetto che fornisce informazioni di formattazione. .NET supporta le due implementazioni di IFormatProvider seguenti per l'analisi di stringhe numeriche:
Oggetto CultureInfo il cui metodo CultureInfo.GetFormat restituisce un oggetto NumberFormatInfo che fornisce informazioni di formattazione specifiche del contesto culturale.
Oggetto NumberFormatInfo il cui metodo NumberFormatInfo.GetFormat restituisce se stesso.
L'esempio seguente tenta di convertire ogni stringa in una matrice in un valore Double. Prima di tutto tenta di analizzare la stringa utilizzando un provider di formato che rispecchia le convenzioni della cultura inglese (Stati Uniti). Se questa operazione genera un FormatException, tenta di interpretare la stringa usando un fornitore di formattazione che riflette le convenzioni della cultura francese (Francia).
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($"{culture.Name}: {value} --> {number}");
}
catch (FormatException) {
Console.WriteLine($"{culture.Name}: Unable to parse '{value}'.");
culture = CultureInfo.CreateSpecificCulture("fr-FR");
try {
number = Double.Parse(value, culture);
Console.WriteLine($"{culture.Name}: {value} --> {number}");
}
catch (FormatException) {
Console.WriteLine($"{culture.Name}: Unable to parse '{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'.
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'.
Analisi sintattica e valori degli stili numerici
Gli elementi di stile, ad esempio spazi vuoti, separatori di gruppo e separatore decimale, che l'operazione di analisi può gestire sono definiti da un valore di enumerazione NumberStyles. Per impostazione predefinita, le stringhe che rappresentano valori interi vengono analizzate usando il valore NumberStyles.Integer, che consente solo cifre numeriche, spazi vuoti iniziali e finali e un segno iniziale. Le stringhe che rappresentano valori a virgola mobile vengono analizzate usando una combinazione dei valori NumberStyles.Float e NumberStyles.AllowThousands; questo stile composito consente cifre decimali insieme a spazi vuoti iniziali e finali, un segno iniziale, un separatore decimale, un separatore di gruppo e un esponente. Chiamando un overload del metodo Parse
o TryParse
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 che contiene un separatore di gruppo non può essere convertita in un valore Int32 usando il metodo Int32.Parse(String). Tuttavia, la conversione ha esito positivo se si usa il flag NumberStyles.AllowThousands, come illustrato nell'esempio seguente.
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($"{value} --> {number}");
else
Console.WriteLine($"Unable to convert '{value}'");
if (Int32.TryParse(value, NumberStyles.Integer | NumberStyles.AllowThousands,
provider, out number))
Console.WriteLine($"{value} --> {number}");
else
Console.WriteLine($"Unable to convert '{value}'");
}
}
// The example displays the following output:
// Unable to convert '1,304'
// 1,304 --> 1304
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
Avvertimento
L'operazione di analisi usa sempre le convenzioni di formattazione di una determinata cultura. Se non si specifica una cultura passando un oggetto CultureInfo o NumberFormatInfo, si utilizza la cultura associata al thread corrente.
La tabella seguente elenca i membri dell'enumerazione NumberStyles e descrive l'effetto che hanno sull'operazione di analisi.
Valore NumberStyles | Effetto sulla stringa da analizzare |
---|---|
NumberStyles.None | Sono consentite solo cifre numeriche. |
NumberStyles.AllowDecimalPoint | Sono consentiti il separatore decimale e le cifre frazionarie. Per i valori integer, è consentito solo zero come cifra frazionaria. I separatori decimali validi sono determinati dalla proprietà NumberFormatInfo.NumberDecimalSeparator o NumberFormatInfo.CurrencyDecimalSeparator. |
NumberStyles.AllowExponent | Il carattere "e" o "E" può essere usato per indicare la notazione esponenziale. Per altre informazioni, vedere NumberStyles. |
NumberStyles.AllowLeadingWhite | È consentito lo spazio vuoto iniziale. |
NumberStyles.AllowTrailingWhite | Gli spazi bianchi finali sono consentiti. |
NumberStyles.AllowLeadingSign | Un segno positivo o negativo può precedere cifre numeriche. |
NumberStyles.AllowTrailingSign | Un segno positivo o negativo può seguire cifre numeriche. |
NumberStyles.AllowParentheses | Le parentesi possono essere usate per indicare valori negativi. |
NumberStyles.AllowThousands | Il separatore di gruppo è consentito. Il carattere separatore di gruppo è determinato dalla proprietà NumberFormatInfo.NumberGroupSeparator o NumberFormatInfo.CurrencyGroupSeparator. |
NumberStyles.AllowCurrencySymbol | Il simbolo di valuta è consentito. Il simbolo di valuta è definito dalla proprietà NumberFormatInfo.CurrencySymbol. |
NumberStyles.AllowHexSpecifier | La stringa da analizzare viene interpretata come numero esadecimale. Può includere le cifre esadecimali 0-9, A-F e a-f. Questo flag può essere usato solo per analizzare i valori integer. |
NumberStyles.AllowBinarySpecifier | La stringa da analizzare viene interpretata come numero binario. Può includere le cifre binarie 0 e 1. Questo flag può essere usato solo per analizzare i valori integer. |
Inoltre, l'enumerazione NumberStyles fornisce i seguenti stili compositi, che includono diversi flag NumberStyles.
Analisi di BigIntegers binari ed esadecimali
Durante l'analisi BigInteger con i AllowHexSpecifier flag o AllowBinarySpecifier , la stringa di input viene interpretata come un numero esadecimale/binario di esattamente la lunghezza della stringa. Ad esempio, l'analisi "11"
come BigInteger binario produce -1
, perché è l'interpretazione di 11
come valore di complemento a due con segno con esattamente 2 cifre. Se si desidera un risultato positivo, aggiungere un elemento iniziale 0
, ad esempio "011"
, che viene analizzato come 3
.
Analisi e cifre Unicode
Lo standard Unicode definisce i punti di codice per le cifre in vari sistemi di scrittura. Ad esempio, i punti di codice da U+0030 a U+0039 rappresentano le cifre latine di base da 0 a 9, i punti di codice da U+09E6 a U+09EF rappresentano le cifre bangla da 0 a 9 e i punti di codice da U+FF10 a 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 0-9 con punti di codice da U+0030 a U+0039. Se viene passato un metodo di analisi numerica a una stringa contenente altre cifre, il metodo genera un FormatException.
Nell'esempio seguente viene utilizzato il metodo Int32.Parse per analizzare le stringhe costituite da cifre in sistemi di scrittura diversi. Come illustrato nell'output dell'esempio, il tentativo di analizzare le cifre latine di base ha esito positivo, ma il tentativo di analizzare le cifre Fullwidth, Arabo-Indic e Bangla ha esito negativo.
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 Bangla digits 1-5.
value = "\u09e7\u09e8\u09e9\u09ea\u09eb";
ParseDigits(value);
}
static void ParseDigits(string value)
{
try {
int number = Int32.Parse(value);
Console.WriteLine($"'{value}' --> {number}");
}
catch (FormatException) {
Console.WriteLine($"Unable to parse '{value}'.");
}
}
}
// The example displays the following output:
// '12345' --> 12345
// Unable to parse '12345'.
// Unable to parse '١٢٣٤٥'.
// Unable to parse '১২৩৪৫'.
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 Bangla 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 '১২৩৪৫'.