Necesitas:
1) El Namespace System.Globalization
2) Crear un objeto de la clase System.Globalization.CultureInfo.NumberFormatInfo. Es preferible crearlo en el módulo como Friend para poder usarlo en cualquier parte:
Código vb.net:
Ver originalFriend nFI As NumberFormatInfo = New CultureInfo("en-US", False).NumberFormat
3) Usar ese objeto cuando conviertes un valor de punto flotante a string:
Código vb.net:
Ver originalDim oVarDouble as string = oDato.ToString("f", nfi)
En este ejemplo, oDato es una variable de tipo Double, que puede contener cualquier tipo de valor.
El problema surge cuando la region declarada en el sistema es de tipo "es-XX", donde "XX" en el sufijo de cualquier país de habla española.
Esto hace que cualquier conversión de Double a String use los símbolos regionales de decimal y de grupos de miles. Como en Español estos son, respectivamente, la coma y el punto, hay que usar alguna de las regionalizaciones de inglés. De allí que use "en-US", o sea, Inglés - Estados Unidos.
A su vez, si el dato está viniendo de la base, por ejemplo, en su formato natural (como DECIMAL, FLOAT, DOUBLE o lo que sea), para que puedas representarlo con coma en lugar de punto decimal, debes usar un objeto de regionalización en español, por ejemplo:
Código vb.net:
Ver originalFriend oEsI As NumberFormatInfo = New CultureInfo("es-MX", False).NumberFormat
Este caso es Español - México.
Nunca debes dejar que la representación y las conversiones estén en manos del sistema, porque tendrás problemas de portabilidad entre diferentes PCs. Piensa que la mayoría de la gente ni siquiera mira qué región tienen declarada en el formato de fechas y números... (la vagancia es universal)
Cuando dejas que el sistema regule todo, o tienes problemas con los usuarios, que no comprenden lo que se les presenta en la pantalla, o tienes errores de Excepciones no controladas, por defectos de conversión... Y eso nunca debe suceder.
No te olvides que los clientes no quieren explicaciones, quieren que las cosas funcionen bien.