2012-06-16 30 views
10

Tengo una cadena como 5.5kg o 7.90gram y quiero obtener 5.5 o 7.90 como un valor decimal. ¿Cómo puedo obtener ese resultado en C# y una cosa más que mi cadena siempre comienza con decimal?Extracto decimal del comienzo de la cadena

Aquí está mi código que arroja un error siempre que encuentre algo excepto un decimal.

string weight = attributeValue; 
if (!string.IsNullOrEmpty(weight)) 
{ 
    product.Weight = Convert.ToDecimal(attributeValue); 
} 
else 
{ 
    product.Weight = 0.00m; 
} 
+0

Uso TryParse(). –

Respuesta

28

Crearía una expresión regular que coincida con la parte del número principal. Esto dependerá en parte de si va a siempre tienen un punto decimal, si desea permitir que comas para separadores de miles, si se va a utilizar siempre . como el punto decimal, etc. podría ser algo como esto, sin embargo:

^-?\d+(?:\.\d+)? 

Luego que coincida con la expresión regular contra el texto, tomar el valor del partido (si es exitosa) y utilizar decimal.Parse o double.Parse en ese valor:

Regex regex = new Regex(@"^-?\d+(?:\.\d+)?"); 
Match match = regex.Match(text); 
if (match.Success) 
{ 
    weight = decimal.Parse(match.Value, CultureInfo.InvariantCulture); 
} 

Tenga en cuenta que para los valores "naturales" como la masa , usted puede mejor con double que decimal. Este último es más apropiado para valores "artificiales" como la moneda, que naturalmente se expresan mejor en decimales y tienen valores exactos. Sin embargo, depende de lo que estés haciendo.

+0

La expresión regular actual solo coincidirá con los flotantes/enteros al comienzo de la cadena debido a '^' anchor. Para extraer números de cualquier ubicación en la cadena, use '-? \ D + (?: \. \ D +)?'. O '[- +]? [0-9] * \.? [0-9] + (?: [EE] [- +]? [0-9] +)?' –

+0

@ WiktorStribiżew: Sí, porque yo respondió la pregunta que se hizo: "una cosa más que mi cadena siempre comenzará con decimal". –

+0

Sí, claro, solo el título no implica que, creo que debería ser editado. –

0

Para su formato de entrada se puede obtener por este código decimal

var weight =Decimal.Parse(Regex.Match(input_string, "[0-9]*\\.*[0-9]*").Value); 

si su cadena de entrada está en formato diferente, entonces usted tiene que cambiar el patrón de expresión regular .

2

aquí es un enfoque completamente diferente

string oldstr = "1.7meter"; 
     Char[] strarr = oldstr.ToCharArray().Where(c => Char.IsDigit(c) || Char.IsPunctuation(c)).ToArray(); 
     decimal number = Convert.ToDecimal(new string(strarr)); 
Cuestiones relacionadas