解析CSharp中的float值的最佳方法是什么? 我知道TryParse,但我特别想知道的是点,逗号等。解析float的最佳方法是什么?
我遇到了问题,我的网站。在我的开发服务器上,','是小数,'。'为分离器。然而,在产品服务器上,这是相反的。 我该如何最好地捕捉这个?
解析CSharp中的float值的最佳方法是什么? 我知道TryParse,但我特别想知道的是点,逗号等。解析float的最佳方法是什么?
我遇到了问题,我的网站。在我的开发服务器上,','是小数,'。'为分离器。然而,在产品服务器上,这是相反的。 我该如何最好地捕捉这个?
取决于输入来自哪里。
如果您的输入来自用户,则应使用用户/页面正在使用的CultureInfo(Thread.CurrentThread.CurrentUICulture)。
您可以通过查看HttpRequest.UserLanguages属性获取并显示用户的文化。 (不正确的100%,但我发现它是一个非常好的初步猜测)有了这些信息,您可以在页面的开头设置Thread.CurrentThread.CurrentUICulture。
如果您的输入来自内部源,则可以使用InvariantCulture来解析字符串。
如果您的输入来自受控源,则Parse方法的使用稍微容易一些。也就是说,你已经验证了字符串。如果解析失败,解析将抛出(缓慢)异常。
如果输入是不受控制的(来自用户或其他互联网源),TryParse对我来说更好看。
使用Try/Parse解析时使用中性文化(或您知道的)。
如果你想持续存在的价值观(数字,日期,时间等)为了内部的目的。每次使用“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);
是真实的,但并不真正与问题相关。 – 2008-11-15 12:32:41
传递一个CultureInfo或NumberFormatInfo表示要解析浮动的文化;这控制着什么字符被用于小数,组分隔符等。
例如,以确保'。'字符被视为您可以在CultureInfo.InvariantCulture中传递的十进制指示符(在服务器应用程序中,您倾向于希望事物相同,而不考虑环境的文化)。
我同意勒皮的回复;把它放在代码中:
string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
你总是可以使用Parse的过载,其中包括文化的使用?
例如:
Double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting
如果您有您所有数据的控制,你应该在所有的代码中使用“CultureInfo.InvariantCulture”。
尽量避免使用float.Parse,而是使用TryParse,因为它执行得更好,但执行相同的工作。 这也适用于double,DateTime等...
(部分型号还提供TryParseExact还执行得更好!)
即使所有数据都有效,TryParse确实能够更快速地工作吗?我希望他们在“成功”的情况下具有相同的性能,但由于抛出异常的成本,TryParse比Parse更快。 – 2008-09-29 15:48:23
然后又一次,如果TryParse返回false,你会抛出异常吗?在这种情况下,float.Parse比TryParse更有效率! – Sklivvz 2008-09-30 08:32:33
来源是从一个网站的输入。我不能依靠它是有效的。所以我像前面提到的那样使用TryParse。 但我不知道如何给currentCulture它。
此外,这会给我它目前运行的服务器的文化,但因为它是万维网,用户可以从任何地方......
既然你不知道网络用户文化,你可以做一些猜测。 TryParse带有一种文化,用于分隔符和。对于十进制数,AND TryParse与使用的文化。分隔符和小数。如果他们都成功,但得到不同的答案,那么你将不得不问他们打算用户。否则,你可以正常进行,只要你有两个相同的结果或一个有用的结果或没有可用的结果。
你就可以知道一个简单的语句服务器的当前Cuklture:
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;
注有ID的CurrentUICulture属性,但的UICulture从ResourceMeanager形式MULTILANGUAGES应用。对于数字格式,您必须考虑CurrentCulture。
我希望这会帮助你
愿意,因为它似乎每个人都这样做。 我个人尽量避开<3个字符的搜索词。当所有搜索必须> 3个字符时,认为这是一直困扰着我的东西。 #号也使我的蜘蛛感到兴奋。 – 2008-09-30 09:00:19