Преобразование строки C # в число с плавающей запятой - PullRequest
4 голосов
/ 22 октября 2010

Мне нужно преобразовать строку в число с плавающей точкой.Это мой пример строки:

1 МВт +00000,00 мм
2 МВт +0000.000 мм
3 МВт -00000.01 мм
4 МВт +00000.00 мм
5 МВт +00002,92 мм
6 МВт +00002.69 мм

И вот что я делаю:

text = text.Substring(pos + 5, 9).Trim();                  
float val = 0.0F;
float.TryParse(texto, out val);
this.txtDimension1.Text = val.ToString();

Хорошо, это работает для моей среды, которая называется en_US, но когда я запускаю эту жекусок кода в испанской среде, он преобразует -00000.01 в -1.0

Я думаю, что это проблема запятой, в английских числах они разделены точкой ("."), а в испанском они разделены запятой (",").

Как я могу заставить эту работу работать на обоих языках?

Спасибо, Ричард.

Ответы [ 5 ]

5 голосов
/ 22 октября 2010

Вам необходимо передать CultureInfo для культуры, в которой отформатированы строки.

http://msdn.microsoft.com/en-us/library/3s27fasw.aspx

Пример из MSDN будет:

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);

В качестве альтернативы, если строки input отформатированы иначе, используйте CultureInfo.CurrentCulture

4 голосов
/ 22 октября 2010

Использование CultureInfo.InvariantCulture.

float.TryParse(texto, NumberStyles.Any, CultureInfo.InvariantCulture, out val);

Если входные строки могут различаться, вам придется обнаружить это и сопоставить ваш ввод с правильной культурой.

2 голосов
/ 22 октября 2010

Вы можете попробовать реализовать, используя метод ToSingle, который по сути является псевдонимом «Float»

в C #.

float val = (float)System.Convert.ToSingle(text);

Я согласен с Робертом Харви, который указывает на информацию о культуре и использует перегрузку Tryparse. Хорошее предложение!

1 голос
/ 22 октября 2010

Это не ответ на вопрос, но я добавил его в качестве ответа только для того, чтобы показать код ..

Я просто хочу предупредить вас об использовании Substring, это может вызвать проблемыкогда первое число становится больше 9 [Два символа +].

Я думаю, что в этом случае лучше использовать регулярное выражение, и вам нужно следующее выражение:

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);

Примечание:Вы можете улучшить качество выражения, проверив значение, если это номер потока, но я думаю, что этого достаточно для вашей ситуации.

Удачи!

0 голосов
/ 22 октября 2010

Вам нужно будет использовать перегрузку TryParse, которая позволяет вам указывать культуру, вы хотите получить информацию о культуре для en-us, а затем вы можете получить ее для всех одинаково.

...