Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Tous les types numériques ont deux méthodes d’analyse statiques et ParseTryParse, que vous pouvez utiliser pour convertir la représentation sous forme de chaîne d’un nombre en type numérique. Ces méthodes vous permettent d’analyser des chaînes produites à l’aide des chaînes de format documentées dans des chaînes de format numérique standard et des chaînes de format numérique personnalisées. Par défaut, les méthodes Parse et TryParse peuvent convertir des chaînes qui contiennent uniquement des chiffres numériques décimaux en valeurs entières. Ils peuvent convertir avec succès des chaînes qui contiennent des chiffres décimaux intégraux et fractionnaires, des séparateurs de groupes et un séparateur décimal en valeurs à virgule flottante. La Parse méthode lève une exception si l’opération échoue, tandis que la TryParse méthode retourne false.
Note
À compter de .NET 7, les types numériques dans .NET implémentent également l’interface System.IParsable<TSelf>, qui définit les méthodes IParsable<TSelf>.Parse et IParsable<TSelf>.TryParse.
Analyse et fournisseurs de format
En règle générale, les représentations sous forme de chaîne de valeurs numériques diffèrent par culture. Les éléments de chaînes numériques, tels que les symboles monétaires, les séparateurs de groupe (ou milliers) et les séparateurs décimaux, varient tous selon la culture. Les méthodes d’analyse utilisent implicitement ou explicitement un fournisseur de format qui reconnaît ces variations propres à la culture. Si aucun fournisseur de format n’est spécifié dans un appel à la méthode Parse ou TryParse, le fournisseur de format associé à la culture actuelle (l’objet NumberFormatInfo retourné par la propriété NumberFormatInfo.CurrentInfo) est utilisé.
Un fournisseur de format est représenté par une IFormatProvider implémentation. Cette interface a un seul membre, la GetFormat méthode dont le paramètre unique est un Type objet qui représente le type à mettre en forme. Cette méthode retourne l’objet qui fournit des informations de mise en forme. .NET prend en charge les deux IFormatProvider implémentations suivantes pour analyser les chaînes numériques :
Objet CultureInfo dont CultureInfo.GetFormat la méthode retourne un NumberFormatInfo objet qui fournit des informations de mise en forme propres à la culture.
Objet NumberFormatInfo dont la méthode NumberFormatInfo.GetFormat renvoie lui-même.
L’exemple suivant tente de convertir chaque chaîne d’un tableau en valeur Double . Il tente d’abord d’analyser la chaîne à l’aide d’un fournisseur de format qui reflète les conventions de la culture anglaise (États-Unis). Si cette opération lève un FormatException, il tente d’analyser la chaîne à l’aide d’un fournisseur de format qui reflète les conventions de la culture française (France).
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'.
Valeurs d'analyse syntaxique et StylesDeNombre
Les éléments de style (tels que les espaces blancs, les séparateurs de groupes et le séparateur décimal) que l’opération d’analyse peut gérer sont définis par une NumberStyles valeur d’énumération. Par défaut, les chaînes qui représentent des valeurs entières sont analysées à l’aide de la NumberStyles.Integer valeur, qui autorise uniquement les chiffres numériques, les espaces blancs de début et de fin et un signe de début. Les chaînes qui représentent des valeurs à virgule flottante sont analysées à l’aide d’une combinaison des valeurs NumberStyles.Float et NumberStyles.AllowThousands ; ce style composite autorise les chiffres décimaux ainsi que les espaces blancs de début et de fin, un signe de début, un séparateur décimal, un séparateur de groupe et un exposant. En appelant une surcharge de la méthode Parse qui inclut un paramètre de type TryParse et en définissant un ou plusieurs drapeaux NumberStyles, vous pouvez contrôler les éléments de style qui peuvent être présents dans la chaîne pour que l'opération d'analyse NumberStyles réussisse.
Par exemple, une chaîne qui contient un séparateur de groupe ne peut pas être convertie en Int32 valeur à l’aide de la Int32.Parse(String) méthode. Toutefois, la conversion réussit si vous utilisez l’indicateur NumberStyles.AllowThousands , comme l’illustre l’exemple suivant.
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
Avertissement
L’opération d’analyse utilise toujours les conventions de mise en forme d’une culture particulière. Si vous ne spécifiez pas de culture en passant un objet CultureInfo ou NumberFormatInfo, la culture associée au thread actuel est utilisée.
Le tableau suivant répertorie les membres de l’énumération NumberStyles et décrit l’effet qu’ils ont sur l’opération d’analyse.
| Valeur NumberStyles | Effet sur la chaîne à analyser |
|---|---|
| NumberStyles.None | Seuls les chiffres numériques sont autorisés. |
| NumberStyles.AllowDecimalPoint | Le séparateur décimal et les chiffres fractionnaires sont autorisés. Pour les valeurs entières, seul zéro est autorisé sous la forme d’un chiffre fractionnel. Les séparateurs décimaux valides sont déterminés par la propriété NumberFormatInfo.NumberDecimalSeparator ou la propriété NumberFormatInfo.CurrencyDecimalSeparator. |
| NumberStyles.AllowExponent | Le caractère « e » ou « E » peut être utilisé pour indiquer une notation exponentielle. Pour plus d’informations, consultez NumberStyles. |
| NumberStyles.AllowLeadingWhite | L’espace blanc de début est autorisé. |
| NumberStyles.AllowTrailingWhite | L’espace blanc de fin est autorisé. |
| NumberStyles.AllowLeadingSign | Un signe positif ou négatif peut précéder des chiffres numériques. |
| NumberStyles.AllowTrailingSign | Un signe positif ou négatif peut suivre des chiffres numériques. |
| NumberStyles.AllowParentheses | Les parenthèses peuvent être utilisées pour indiquer des valeurs négatives. |
| NumberStyles.AllowThousands | Le séparateur de groupe est autorisé. Le caractère de séparateur de groupe est déterminé par la propriété NumberFormatInfo.NumberGroupSeparator ou NumberFormatInfo.CurrencyGroupSeparator. |
| NumberStyles.AllowCurrencySymbol | Le symbole monétaire est autorisé. Le symbole monétaire est défini par la NumberFormatInfo.CurrencySymbol propriété. |
| NumberStyles.AllowHexSpecifier | La chaîne à analyser est interprétée comme un nombre hexadécimal. Il peut inclure les chiffres hexadécimaux 0-9, A-F et a-f. Cet indicateur ne peut être utilisé que pour analyser les valeurs entières. |
| NumberStyles.AllowBinarySpecifier | La chaîne à analyser est interprétée comme un nombre binaire. Il peut inclure les chiffres binaires 0 et 1. Cet indicateur ne peut être utilisé que pour analyser les valeurs entières. |
En outre, l’énumération NumberStyles fournit les styles composites suivants, qui incluent plusieurs NumberStyles indicateurs.
Analyse de bigIntegers binaires et hexadécimaux
Lors de l'analyse de BigInteger avec les indicateurs AllowHexSpecifier ou AllowBinarySpecifier, la chaîne d’entrée est interprétée comme un nombre hexadécimal/binaire ayant exactement la longueur de cette chaîne. Par exemple, l’analyse "11" en tant que BigInteger binaire produit -1, car c’est l’interprétation de 11 en valeur en complément à deux signé avec exactement 2 bits. Si vous souhaitez un résultat positif, ajoutez un premier élément 0, comme "011", qui est analysé comme 3.
Analyse syntaxique et chiffres Unicode
La norme Unicode définit des points de code pour les chiffres dans différents systèmes d’écriture. Par exemple, les points de code de U+0030 à U+0039 représentent les chiffres latins de base 0 à 9, les points de code de U+09E6 à U+09EF représentent les chiffres Bangla 0 à 9, et les points de code de U+FF10 à U+FF19 représentent les chiffres Fullwidth 0 à 9. Toutefois, les seuls chiffres numériques reconnus par les méthodes d’analyse sont les chiffres latins de base 0-9 avec des points de code de U+0030 à U+0039. Si une chaîne qui contient d’autres chiffres est passée à une méthode d’analyse numérique, la méthode lève un FormatException.
L’exemple suivant utilise la Int32.Parse méthode pour analyser des chaînes qui se composent de chiffres dans différents systèmes d’écriture. Comme le montre la sortie de l’exemple, la tentative d’analyse des chiffres latins de base réussit, mais la tentative d’analyse des chiffres fullwidth, arabe-indic et bangla échoue.
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 '১২৩৪৫'.