Cómo afecta la referencia cultural a las cadenas en Visual Basic

En esta página de ayuda se describe cómo usa Visual Basic la información de referencia cultural para realizar conversiones y comparaciones de cadenas.

Cuándo usar cadenas con referencias culturales específicas

Por lo general, debe usar cadenas con referencias culturales específicas para todos los datos que se presentan a los usuarios y se leen de ellos, y usar cadenas con referencia cultural invariable para los datos internos de la aplicación.

Por ejemplo, si la aplicación solicita a los usuarios que escriban una fecha como una cadena, es previsible que los usuarios apliquen formato a las cadenas según su referencia cultural y la aplicación deberá convertir la cadena correctamente. Si la aplicación presenta esa fecha en su interfaz de usuario, deberá presentarla con la referencia cultural del usuario.

Sin embargo, si la aplicación carga la fecha en un servidor central, deberá aplicar un formato a la cadena según una referencia cultural específica para evitar confusiones entre formatos de fecha potencialmente diferentes.

Funciones que tienen en cuenta la referencia cultural

Todas las funciones de conversión de cadenas de Visual Basic (excepto las funciones Str y Val) usan la información de referencia cultural de la aplicación para asegurarse de que las conversiones y comparaciones son adecuadas para la referencia cultural del usuario de la aplicación.

La clave para usar correctamente las funciones de conversión de cadenas en aplicaciones que se ejecutan en equipos con diferentes configuraciones de referencia cultural es comprender qué funciones usan una configuración con referencia cultural específica y cuáles usan la configuración de referencia cultural actual. Observe que la configuración de la referencia cultural de la aplicación se hereda, de forma predeterminada, de la configuración del sistema operativo. Para más información, consulte Asc, AscW, Chr, ChrW, Format, Hex, Oct y Funciones de conversión de tipos.

Las funciones Str (que convierte números en cadenas) y Val (convierte cadenas en números) no usan la información de referencia cultural de la aplicación al convertir entre cadenas y números. En vez de eso, solo reconocen el punto (.) como separador decimal válido. Las funciones análogas que tienen en cuenta la referencia cultural son:

  • Conversiones que usan la referencia cultural actual. Las funciones CStr y Format convierten un número en una cadena, y las funciones CDbl y CInt convierten una cadena en un número.

  • Conversiones que usan una referencia cultural específica. Cada objeto de número tiene un método ToString(IFormatProvider) que convierte un número en una cadena y un método Parse(String, IFormatProvider) que convierte una cadena en un número. Por ejemplo, el tipo Double proporciona los métodos ToString(IFormatProvider) y Parse(String, IFormatProvider).

Para obtener más información, vea Str y Val.

Uso de una referencia cultural específica

Imagine que está desarrollando una aplicación que envía una fecha (con formato de cadena) a un servicio web. En este caso, la aplicación debe usar una referencia cultural específica para la conversión de cadenas. Para ilustrar el motivo, observe el resultado del uso del método ToString() de la fecha: si la aplicación usa ese método para dar formato a la fecha del 4 de julio de 2005, devolverá "7/4/2005 12:00:00 AM" cuando se ejecute con la referencia cultural de inglés de Estados Unidos (en-US), pero devolverá "04.07.2005 00:00:00" si se ejecuta con la referencia cultural alemana (de-DE).

Cuando necesite realizar una conversión de cadena en un formato con referencia cultural específica, debe usar la clase CultureInfo que está integrada en .NET Framework. Puede crear un nuevo objeto CultureInfo para una referencia cultural específica pasando el nombre de la referencia cultural al constructor de CultureInfo. Los nombres de las referencias culturales admitidas se muestran en la página de ayuda de la clase CultureInfo.

Alternativamente, puede obtener una instancia de la referencia cultural invariable a partir de la propiedad CultureInfo.InvariantCulture. La referencia cultural invariable se basa en la referencia cultural inglesa, pero hay algunas diferencias. Por ejemplo, la referencia cultural invariable especifica un reloj de 24 horas en lugar de un reloj de 12 horas.

Para convertir una fecha a la cadena de la referencia cultural, pase el objeto CultureInfo al método ToString(IFormatProvider) del objeto de fecha. Por ejemplo, el código siguiente muestra "07/04/2005 00:00:00", independientemente de la configuración de referencia cultural de la aplicación.

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

Nota

Los literales de fecha siempre se interpretan según la referencia cultural inglesa.

Comparar cadenas

Hay dos situaciones importantes en las que se necesitan comparaciones de cadenas:

  • Ordenar los datos para mostrarlos al usuario. Use operaciones basadas en la referencia cultural actual para que las cadenas se ordenen correctamente.

  • Determinar si dos cadenas internas de la aplicación coinciden exactamente (normalmente con fines de seguridad). Use operaciones que omitan la referencia cultural actual.

Puede realizar ambos tipos de comparaciones con la función StrComp de Visual Basic. Especifique el argumento opcional Compare para controlar el tipo de comparación: Text para la mayoría de las entradas y salidas, Binary para determinar las coincidencias exactas.

La función StrComp devuelve un entero que indica la relación entre las dos cadenas comparadas en función del criterio de ordenación. Un valor positivo del resultado indica que la primera cadena es mayor que la segunda. Un resultado negativo indica que la primera cadena es menor y cero indica que las cadenas son iguales.

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

También puede usar el correspondiente de .NET Framework de la función StrComp, el método String.Compare. Se trata de un método estático sobrecargado de la clase de cadena básica. En el ejemplo siguiente se muestra cómo se usa este método:

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

Para un control más preciso sobre cómo se realizan las comparaciones, puede usar sobrecargas adicionales del método Compare. Con el método String.Compare, puede usar el argumento comparisonType para especificar el tipo de comparación que se va a usar.

Valor del argumento comparisonType Tipo de comparación Cuándo se usa
Ordinal Comparación basada en bytes de componentes de cadenas. Use este valor al comparar identificadores que diferencian mayúsculas de minúsculas, configuraciones relacionadas con la seguridad, constantes del sistema u otros identificadores no lingüísticos donde los bytes deben coincidir con exactitud.
OrdinalIgnoreCase Comparación basada en bytes de componentes de cadenas.

OrdinalIgnoreCase usa la información de referencia cultural invariable para determinar cuándo dos caracteres solo difieren en las mayúsculas.
Use este valor al comparar identificadores que no distinguen mayúsculas de minúsculas, configuraciones relacionadas con la seguridad y datos almacenados en Windows.
CurrentCulture o CurrentCultureIgnoreCase Comparación basada en la interpretación de las cadenas de la referencia cultural actual. Use estos valores al comparar los datos que se muestran al usuario, la mayoría de entradas del usuario y otros datos que requieran interpretación lingüística.
InvariantCulture o InvariantCultureIgnoreCase Comparación basada en la interpretación de las cadenas de la referencia cultural invariable.

Esto es diferente de Ordinal y OrdinalIgnoreCase, porque la referencia cultural invariable trata los caracteres fuera de su intervalo de valores aceptados como caracteres invariables equivalentes.
Use estos valores solo cuando compare datos persistentes o se muestren datos importantes desde el punto de vista lingüístico que requieran un criterio de ordenación fijo.

Consideraciones sobre la seguridad

Si la aplicación toma decisiones de seguridad basadas en el resultado de una operación de comparación o cambio de mayúsculas y minúsculas, la operación debe usar el método String.Compare y pasar Ordinal o OrdinalIgnoreCase para el argumento comparisonType.

Consulte también