2011-05-11 20 views
6

Necesito convertir una Cadena en un decimal en C#, pero esta cadena tiene diferentes formatos.Convertir cadena a decimal con formato

Por ejemplo:

"50085"

"500,85"

"500.85"

Esto debería ser Convert 500,85 en decimal. ¿Hay una forma simplificada para hacer esta conversión usando el formato?

+0

decimal no almacena en el formato de "500,85". ¿Estás pidiendo un par de decimales? –

+2

@myermian: Bueno, podría hacerlo, dependiendo de la configuración cultural/local. No todos representan los valores decimales de la misma manera. En este ejemplo, '500,85' podría ser equivalente a' 500.85'. –

+0

¿Podría '50.865,85' ser una posibilidad en su cadena? – V4Vendetta

Respuesta

14

Mientras decimal.Parse () es th El método que está buscando, tendrá que proporcionarle un poco más de información. No elegirá automáticamente entre los 3 formatos que proporcione, tendrá que indicarle qué formato espera (en forma de un proveedor IFormat). Tenga en cuenta que incluso con un proveedor IFormatProvider, no creo que "50085" sea insertado correctamente.

Lo único consistente que veo es que sus ejemplos muestran que siempre espera dos decimales de precisión. Si ese es el caso, se podría eliminar todas la épocas y comas y luego se divide por 100.

Tal vez algo como:

public decimal? CustomParse(string incomingValue) 
{ 
    decimal val; 
    if (!decimal.TryParse(incomingValue.Replace(",", "").Replace(".", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out val)) 
     return null; 
    return val/100; 
} 
+0

No encuentro ningún formato para resolver mi problema. Utilizo esta implementación y agrego decimales. Gracias –

6

Esto va a funcionar, dependiendo de la configuración de la cultura:

string s = "500.85"; 
decimal d = decimal.Parse(s); 

Si su cultura por defecto no permite , en lugar de . como un punto decimal, es probable que tenga que:

s = s.Replace(',','.'); 

Pero necesitará verificar múltiples . ... esto parece reducirse a una cuestión de sanitización de entrada. Si puede validar y desinfectar la entrada para todos conforme a un conjunto de reglas, la conversión a decimal será mucho más fácil.

+0

+1 por mencionar la sanitización de entrada ... -1 por no manejar "50085". Saldos a ningún voto :) –

+0

Me temo que también podría haber una entrada como '50.865,85' – V4Vendetta

+0

@Chris, 50085 daría como resultado 50085 después de decimal.Parquilo ... Sin embargo, aceptaría el no voto, ya que no No creo que esto responda completamente la pregunta de OP. :) – Jaymz

1

Hay numerosas maneras:

  1. System.Convert.ToDecimal("232.23")
  2. Double.Parse("232.23")
  3. double test; Double.TryParse("232.23", out test)

no deje de probar y coger ...

13

Algunas culturas utilizan una coma para indicar el punto flotante. Esto se comprueba con el código siguiente en una página aspx:

var x = decimal.Parse("500,85"); 
Response.Write(x + (decimal)0.15); 

Esto da la respuesta 501 cuando la cultura hilo se ha establecido en una cultura que utiliza la coma como punto flotante.Puede forzar este modo:

var x = decimal.Parse("500,85", new NumberFormatInfo() { NumberDecimalSeparator = "," }); 
3

probar este código de abajo:

string numValue = "500,85"; 
System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("fr-FR"); 
decimal decValue; 
bool decValid = decimal.TryParse(numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue); 
if (decValid) 
{ 
    lblDecNum.Text = Convert.ToString(decValue, culInfo.NumberFormat); 
} 

Desde que estoy dando un valor de 500,85 voy a asumir que la cultura es el francés y, por tanto, el separador decimal es ",". Then decimal.TryParse (numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue); devolverá el valor como 500.85 en decValue. Del mismo modo, si el usuario es inglés, entonces cambie el constructor culInfo.

1

Esta es una nueva característica llamada Digit Grouping Symbol.

Pasos:

  1. región abierta y de idioma en el panel de control
  2. Haga clic en adicional establecer
  3. En la ficha Números
  4. Establecer Dígito Símbolo Agrupación como configuración personalizada. Cambiar coma; reemplace con (cualquier carácter como A a Z o {/,}). Símbolo de agrupación de dígitos = e;

Ejemplo:

string checkFormate = "123e123"; 
decimal outPut = 0.0M; 
decimal.TryParse(checkFormate, out outPut); 
Ans: outPut=123123; 
Cuestiones relacionadas