2008-12-11 7 views
10

Tengo datos de una tabla en una base de datos (cadena) que contienen texto y precio. Extraigo el precio de los datos, pero mi problema es que alguna vez puedo Convertirlo para flotar y en algún momento no.¿Convertir flotación que tiene punto en lugar de coma?

he notado que:

Convert.ToSingle(m.Groups[1].Value); 

Funciona, pero no siempre, porque en algún momento del período es el problema (que requiere una coma). ¿Que puedo hacer? He intentado reemplazar el ".", Por "," pero en algún momento en otra PC es un período que es necesario.

Respuesta

21

Tiene este problema porque la conversión verifica el idioma de su PC. Tendrá que hacer algo como:

Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture.NumberFormat); 

De esta manera, no comprobará el idioma de la PC. Puede encontrar más información sobre InvariantCulture desde MSDN. Tengo algo similar en un proyecto y mi conversión funciona.

+0

¡Me has vencido por 17 segundos! Realmente no necesita la propiedad NumberFormat ya que CultureInfo ya implementa IFormatProvider. – leppie

+0

: P He aumentado mi tipeo ya que estoy participando en SO;) –

0

como han dicho otros:

Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture); 

También debe asegurarse de que se utiliza el InvariantCulture cuando escribir a la base de datos. (Sería incluso mejor si guardó los datos en una columna con su tipo de datos nativo, pero estoy divagando ...)

+0

Solo repetir lo que se ha dicho no le ganará más representantes. – leppie

+0

@leppie, creo que realmente agregué algo de valor. Y, no recibir ningún voto positivo tampoco me dará ningún representante. –

+0

Acepto que el valor * fue * agregado con la explicación del requisito de NumberFormat. – ZombieSheep

2

Si no tiene acceso de escritura a la base de datos, lo primero que debe hacer es intentar convencer a las fuentes de los datos para usar la cultura invariante. Si los datos están siendo introducidos por el usuario se puede hacer algo como:

float f = float.Parse(input); 
string toDb = f.ToString(CultureInfo.InvariantCulture); 

Y luego desde el otro lado:

float f = float.Parse(fromDb, CultureInfo.InvariantCulture); 
string toOutput = f.ToString(); 

Aunque si se puede convencer de que es probable que sea mejor, ya que Lette dice, para convencerlos de que usen el tipo de datos nativo.

yo también, como puede verse a partir de los fragmentos anteriormente, recomiendo el uso de más de float.Parse Convertir para una variedad de razones, pero siendo la más significativa la capacidad de utilizar TryParse:

float f; 
if (!float.TryParse(input, out f)) 
{ 
    // ERROR 
} 
5

O pregunte para este formato de número específico explícitamente:

System.Globalization.NumberFormatInfo nf 
    = new System.Globalization.NumberFormatInfo () 
{ 
    NumberGroupSeparator = "." 
}; 
float f = float.Parse ("5.34534", nf); 
Cuestiones relacionadas