简体   繁体   中英

C# String to Float Conversion

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!

您将需要使用允许您指定文化的TryParse重载,您将需要获取en-us的文化信息,然后您可以让它为每个人解析相同的内容。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM