2008-09-29 99 views
34

解析CSharp中的float值的最佳方法是什么? 我知道TryParse,但我特别想知道的是点,逗号等。解析float的最佳方法是什么?

我遇到了问题,我的网站。在我的开发服务器上,','是小数,'。'为分离器。然而,在产品服务器上,这是相反的。 我该如何最好地捕捉这个?

+1

愿意,因为它似乎每个人都这样做。 我个人尽量避开<3个字符的搜索词。当所有搜索必须> 3个字符时,认为这是一直困扰着我的东西。 #号也使我的蜘蛛感到兴奋。 – 2008-09-30 09:00:19

回答

23

取决于输入来自哪里。

如果您的输入来自用户,则应使用用户/页面正在使用的CultureInfo(Thread.CurrentThread.CurrentUICulture)。

您可以通过查看HttpRequest.UserLanguages属性获取并显示用户的文化。 (不正确的100%,但我发现它是一个非常好的初步猜测)有了这些信息,您可以在页面的开头设置Thread.CurrentThread.CurrentUICulture

如果您的输入来自内部源,则可以使用InvariantCulture来解析字符串。

如果您的输入来自受控源,则Parse方法的使用稍微容易一些。也就是说,你已经验证了字符串。如果解析失败,解析将抛出(缓慢)异常。

如果输入是不受控制的(来自用户或其他互联网源),TryParse对我来说更好看。

3

使用Try/Parse解析时使用中性文化(或您知道的)。

5

如果你想持续存在的价值观(数字,日期,时间等)为了内部的目的。每次使用“InvariantCulture”来格式化&解析值。 “InvariantCulture的”是每台计算机上一样,每个OS与任何用户的文化/语言/等...

string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo); 
float numFloat = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat); 
string strNow = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo); 
DateTime now = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow); 
+0

是真实的,但并不真正与问题相关。 – 2008-11-15 12:32:41

1

传递一个CultureInfoNumberFormatInfo表示要解析浮动的文化;这控制着什么字符被用于小数,组分隔符等。

例如,以确保'。'字符被视为您可以在CultureInfo.InvariantCulture中传递的十进制指示符(在服务器应用程序中,您倾向于希望事物相同,而不考虑环境的文化)。

41

我同意勒皮的回复;把它放在代码中:

string s = "123,456.789"; 
float f = float.Parse(s, CultureInfo.InvariantCulture); 
5

你总是可以使用Parse的过载,其中包括文化的使用?

例如:

Double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting 

如果您有您所有数据的控制,你应该在所有的代码中使用“CultureInfo.InvariantCulture”。

0

尽量避免使用float.Parse,而是使用TryParse,因为它执行得更好,但执行相同的工作。 这也适用于double,DateTime等...

(部分型号还提供TryParseExact还执行得更好!)

+1

即使所有数据都有效,TryParse确实能够更快速地工作吗?我希望他们在“成功”的情况下具有相同的性能,但由于抛出异常的成本,TryParse比Parse更快。 – 2008-09-29 15:48:23

+0

然后又一次,如果TryParse返回false,你会抛出异常吗?在这种情况下,float.Parse比TryParse更有效率! – Sklivvz 2008-09-30 08:32:33

0

来源是从一个网站的输入。我不能依靠它是有效的。所以我像前面提到的那样使用TryParse。 但我不知道如何给currentCulture它。

此外,这会给我它目前运行的服务器的文化,但因为它是万维网,用户可以从任何地方......

-1

既然你不知道网络用户文化,你可以做一些猜测。 TryParse带有一种文化,用于分隔符和。对于十进制数,AND TryParse与使用的文化。分隔符和小数。如果他们都成功,但得到不同的答案,那么你将不得不问他们打算用户。否则,你可以正常进行,只要你有两个相同的结果或一个有用的结果或没有可用的结果。

0

你就可以知道一个简单的语句服务器的当前Cuklture:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture; 

注有ID的CurrentUICulture属性,但的UICulture从ResourceMeanager形式MULTILANGUAGES应用。对于数字格式,您必须考虑CurrentCulture。

我希望这会帮助你

相关问题