C#字符串转换为浮点数

5

我需要把字符串转换成浮点数,以下是我的示例字符串:

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

我正在执行如下操作:

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。

我认为这是一个逗号问题,在英语中,数字用点号(“.”)分隔,在西班牙语中,数字用逗号(“,”)分隔。

我该如何使其在两种语言环境下都能正常工作?

谢谢, Richard。

5个回答

6
你需要传递字符串格式的文化信息(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);

如果您的输入字符串格式不同,则可以使用CultureInfo.CurrentCulture


这里有另一个关于如何实现的SO帖子。https://dev59.com/k07Sa4cB1Zd3GeqP332x - Dustin Laine
好的,我这里有一个问题...如果我传递CultureInfo,比如英语,那么在英语中它会是".",而在西班牙语中会是","吗?谢谢。 - richardalberto
2
@Richard。也许我误解了问题。输入字符串在不同的文化环境下格式不同吗? - PaulG

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

如果输入字符串可能会有所不同,您需要检测并将输入与正确的文化匹配。

2
你可以尝试使用 C# 中的 ToSingle 方法来实现,这个方法本质上就是“Float”别名。
float val = (float)System.Convert.ToSingle(text);

我同意Robert Harvey的观点,他指出了Culture info和使用Tryparse重载的重要性。这是一个好建议!


1
他要求进行“字符串转浮点数转换”。查看代码并添加正确的字符串到浮点数转换,“ToSingle”正好做到了这一点!!!这就是所需的,而且Robert的建议解决了“西班牙语”的文化问题。由于已经在上面回答过了,我觉得没必要重复我的回复。因此,你的逻辑是错误的,你需要进行语法检查。显然你没有看清事情的全貌。另外,为什么我需要为你的理解金光闪闪地呈现这个答案,而你却投了反对票?如果你不懂正确的转换,你就不应该评判。 - Nightforce2

1

这并不是对问题的回答,只是我将其作为答案添加进来,以显示代码。

我只是想提醒您使用 Substring 时可能会出现问题,当第一个数字变成两位数及以上时 [两个字符+]。

我认为在这种情况下使用正则表达式更好,以下是您需要的表达式:

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

你需要使用TryParse重载函数,它允许你指定Culture信息。你需要获取en-us的Culture信息,然后就可以将其解析为每个人都相同的格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接