Comment les informations de culture affectent les chaînes dans Visual Basic

Cette page d’aide explique comment Visual Basic utilise les informations de culture pour effectuer des conversions et des comparaisons de chaînes.

Quand utiliser des chaînes spécifiques à la culture

En règle générale, vous devez utiliser des chaînes spécifiques à la culture pour toutes les données présentées aux utilisateurs et lues par les utilisateurs, et utiliser des chaînes invariantes de culture pour les données internes de votre application.

Par exemple, si votre application demande aux utilisateurs d’entrer une date sous forme de chaîne, elle doit s’attendre à ce que les utilisateurs mettent en forme les chaînes en fonction de leur culture, et l’application doit convertir la chaîne de manière appropriée. Si votre application présente ensuite cette date dans son interface utilisateur, elle doit la présenter dans la culture de l’utilisateur.

Toutefois, si l’application charge la date sur un serveur central, elle doit mettre en forme la chaîne en fonction d’une culture spécifique, afin d’éviter toute confusion entre des formats de date potentiellement différents.

Fonctions sensibles à la culture

Toutes les fonctions de conversion de chaînes Visual Basic (à l’exception des fonctions Str et Val) utilisent les informations de culture de l’application pour s’assurer que les conversions et les comparaisons conviennent à la culture de l’utilisateur de l’application.

La clé pour utiliser correctement les fonctions de conversion de chaînes dans les applications qui s’exécutent sur des ordinateurs avec des paramètres de culture différents consiste à comprendre quelles fonctions utilisent un paramètre de culture spécifique et celles qui utilisent le paramètre de culture actuel. Notez que les paramètres de culture de l’application sont, par défaut, hérités des paramètres de culture du système d’exploitation. Pour plus d’informations, consultez Asc, AscW, ChrChrW, Format, Hex, Oct et Fonctions de conversion de type.

Les fonctions Str (convertit des nombres en chaînes) et Val (convertit des chaînes en nombres) n’utilisent pas les informations de culture de l’application lors de la conversion entre des chaînes et des nombres. Au lieu de cela, elles reconnaissent uniquement le point (.) comme séparateur décimal valide. Les équivalents culturellement conscients de ces fonctions sont les suivants :

  • Conversions qui utilisent la culture actuelle. Les fonctions CStr et Format convertissent un nombre en chaîne, et les fonctions CDbl et CInt convertissent une chaîne en nombre.

  • Conversions qui utilisent une culture spécifique. Chaque objet nombre possède une méthode ToString(IFormatProvider) qui convertit un nombre en chaîne et une méthode Parse(String, IFormatProvider) qui convertit une chaîne en nombre. Par exemple, le type Double fournit les méthodes ToString(IFormatProvider) et Parse(String, IFormatProvider).

Pour plus d’informations, consultez Str et Val.

Utilisation d’une culture spécifique

Imaginez que vous développiez une application qui envoie une date (mise en forme sous forme de chaîne) à un service Web. Dans ce cas, votre application doit utiliser une culture spécifique pour la conversion de chaînes. Pour illustrer pourquoi, prenez le résultat de l’utilisation de la méthode ToString() de la date : si votre application utilise cette méthode pour mettre en forme la date du 4 juillet 2005, elle retourne « 7/4/2005 12:00:00 AM » lorsqu’elle est exécutée avec la culture des États-Unis en anglais (en-US), mais elle retourne « 04.07.2005 00:00:00 » lorsqu’elle est exécutée avec la culture allemande (de-DE).

Lorsque vous devez effectuer une conversion de chaîne dans un format de culture spécifique, vous devez utiliser la classe CultureInfo intégrée au .NET Framework. Vous pouvez créer un objet CultureInfo pour une culture spécifique en passant le nom de la culture au constructeur CultureInfo. Les noms de culture pris en charge sont répertoriés dans la page d’aide de la classe CultureInfo.

Vous pouvez également obtenir une instance de la culture invariante à partir de la propriété CultureInfo.InvariantCulture. La culture invariante est basée sur la culture anglaise, mais il y a quelques différences. Par exemple, la culture invariante spécifie une horloge de 24 heures au lieu d’une horloge de 12 heures.

Pour convertir une date en chaîne de la culture, passez l’objet CultureInfo à la méthode ToString(IFormatProvider) de l’objet date. Par exemple, le code suivant affiche « 07/04/2005 00:00:00 », quels que soient les paramètres de culture de l’application.

Dim d As Date = #7/4/2005#
MsgBox(d.ToString(System.Globalization.CultureInfo.InvariantCulture))

Notes

Les littéraux de date sont toujours interprétés en fonction de la culture anglaise.

Comparaison de chaînes

Il existe deux situations importantes dans lesquelles des comparaisons de chaînes sont nécessaires :

  • Triez des données pour les afficher à l’utilisateur. Utilisez des opérations basées sur la culture actuelle afin que les chaînes trient correctement.

  • Déterminez si deux chaînes internes d’application correspondent exactement (généralement à des fins de sécurité). Utilisez des opérations qui ignorent la culture actuelle.

Vous pouvez effectuer les deux types de comparaisons avec la fonction Visual Basic StrComp. Spécifiez l’argument facultatif Compare pour contrôler le type de comparaison : Text pour la plupart des entrées et sorties Binary pour déterminer les correspondances exactes.

La fonction StrComp retourne un entier qui indique la relation entre les deux chaînes comparées en fonction de l’ordre de tri. Une valeur positive pour le résultat indique que la première chaîne est supérieure à la deuxième chaîne. Un résultat négatif indique que la première chaîne est plus petite et que zéro indique l’égalité entre les chaînes.

' Defines variables.
Dim testStr1 As String = "ABCD"
Dim testStr2 As String = "abcd"
Dim testComp As Integer
' The two strings sort equally. Returns 0.
testComp = StrComp(testStr1, testStr2, CompareMethod.Text)
' testStr1 sorts before testStr2. Returns -1.
testComp = StrComp(testStr1, testStr2, CompareMethod.Binary)
' testStr2 sorts after testStr1. Returns 1.
testComp = StrComp(testStr2, testStr1, CompareMethod.Binary)

Vous pouvez également utiliser le partenaire .NET Framework de la fonction StrComp, la méthode String.Compare. Il s’agit d’une méthode statique et surchargée de la classe de chaîne de base. L’exemple suivant illustre l’utilisation de cette méthode :

Dim myString As String = "Alphabetical"
Dim secondString As String = "Order"
Dim result As Integer
result = String.Compare(myString, secondString)

Pour un contrôle plus précis de la façon dont les comparaisons sont effectuées, vous pouvez utiliser des surcharges supplémentaires de la méthode Compare. Avec la méthode String.Compare, vous pouvez utiliser l’argument comparisonType pour spécifier le type de comparaison à utiliser.

Valeur de l’argument comparisonType Type de comparaison Quand l’utiliser
Ordinal Comparaison basée sur les octets de composant des chaînes. Utilisez cette valeur lors de la comparaison : identificateurs respectant la casse, paramètres liés à la sécurité ou autres identificateurs non linguistiques où les octets doivent correspondre exactement.
OrdinalIgnoreCase Comparaison basée sur les octets de composant des chaînes.

OrdinalIgnoreCase utilise les informations de culture invariantes pour déterminer quand deux caractères diffèrent uniquement en majuscules.
Utilisez cette valeur lors de la comparaison : identificateurs ne respectant pas la casse, paramètres liés à la sécurité et données stockées dans Windows.
CurrentCulture ou CurrentCultureIgnoreCase Comparaison basée sur l’interprétation des chaînes dans la culture actuelle. Utilisez ces valeurs lors de la comparaison : les données affichées à l’utilisateur, la plupart des entrées utilisateur et d’autres données qui nécessitent une interprétation linguistique.
InvariantCulture ou InvariantCultureIgnoreCase Comparaison basée sur l’interprétation des chaînes dans la culture invariante.

Ceci est différent de Ordinal et OrdinalIgnoreCase, car la culture invariante traite les caractères en dehors de sa plage acceptée comme des caractères invariants équivalents.
Utilisez ces valeurs uniquement lors de la comparaison de données persistantes ou de l’affichage de données linguistiques pertinentes qui nécessitent un ordre de tri fixe.

Considérations relatives à la sécurité

Si votre application prend des décisions de sécurité basées sur le résultat d’une comparaison ou d’une opération de changement de cas, l’opération doit utiliser la méthode String.Compare et passer Ordinal ou OrdinalIgnoreCase pour l’argument comparisonType.

Voir aussi