I need to convert a string to a float. These is is my example string:
1 MW +00000.00 mm
2 MW +0000.000 mm
3 MW -00000.01 mm
4 MW +00000.00 mm
5 MW +00002.92 mm
6 MW +00002.69 mm
And this is what i'm doing:
text = text.Substring(pos + 5, 9).Trim();
float val = 0.0F;
float.TryParse(texto, out val);
this.txtDimension1.Text = val.ToString();
Okay, this works for my environment, which is en_US, but when i run this same piece of code in an Spanish environment, it converts -00000.01 to -1.0
I think it's a comma problem, in english numbers are separated by a dot (".") and spanish they are separated by a comma (",").
How can i make this work on both langs?
Thanks,
Richard.
You need to pass the CultureInfo for the culture that the strings are formatted in.
http://msdn.microsoft.com/en-us/library/3s27fasw.aspx
The example from MSDN would be:
double number;
string value = "1,097.63";
NumberStyles style = NumberStyles.Number | NumberStyles.AllowCurrencySymbol;
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
if (Double.TryParse(value, style, culture, out number))
Console.WriteLine("Converted '{0}' to {1}.", value, number);
else
Console.WriteLine("Unable to convert '{0}'.", value);
Alternatively, if your input strings are formatted differently then use CultureInfo.CurrentCulture
Use CultureInfo.InvariantCulture.
float.TryParse(texto, NumberStyles.Any, CultureInfo.InvariantCulture, out val);
If the input strings can vary, you will have to detect that and match up your input with the correct culture.
You could try implementing by using the ToSingle method which is essentially the Alias "Float"
in C#.
float val = (float)System.Convert.ToSingle(text);
I agree with Robert Harvey as he points out the Culture info and using Tryparse overload. Good suggestion!
It's not an answer for the question, but I added it as an answer just to show the code..
I just want to alert you about using Substring
, It'll may cause a problem when the first number become more than 9 [Two chars+].
I think using regular expression is better in this case, and this is the expression that you need:
string str = @"4 MW +12345.67 mm";
Regex r = new Regex(@".* MW (?<number>.+) mm", RegexOptions.IgnoreCase);
var match = r.Match(str);
string matchedString = string.Empty;
if (match.Success)
matchedString = match.Groups["number"].Value;
Console.WriteLine(matchedString);
Note: you can improve the quality of the expression by check the value if it's a flow number, but I think this is enough for your situation.
Good luck!
You will need to use the TryParse overload that allows you to specify the Culture, you will want to get the Culture info for en-us and then you can have it parse the same for everyone.