解析浮动的最佳方法?
在CSharp中解析浮点数的最佳方法是什么?
我知道TryParse,但是我特别想知道的是点,逗号等。
我的网站有问题。在我的开发服务器上,","代表小数点"。"。用于分隔符。在生产服务器上,却是相反的情况。
我怎样才能最好地捕捉到这一点?
解决方案
在使用"尝试/解析"进行解析时,请使用一种中性的区域性(或者我们知道的一种)。
如果我们要持久保留值(数字,日期,时间等)以供内部使用。每次使用" InvariantCulture"来格式化和解析值。每台计算机上的" InvariantCulture"都是相同的,每台操作系统都具有用户的区域性/语言/等。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
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 );
传递一个CultureInfo或者NumberFormatInfo,它表示我们要将float解析为的文化;这可以控制小数点,组分隔符等使用哪些字符。
例如确保"。"字符被视为我们可以在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"。
取决于输入来自何处。
如果输入来自用户,则应使用用户/页面正在使用的CultureInfo(Thread.CurrentThread.CurrentUICulture)。
通过查看HttpRequest.UserLanguages属性,我们可以获取并指示用户的文化。 (不正确的是100%,但是我发现这是一个很好的第一次猜测)有了这些信息,我们可以在页面开始处设置Thread.CurrentThread.CurrentUICulture。
如果输入来自内部来源,则可以使用InvariantCulture解析字符串。
如果输入来自受控来源,则Parse方法在某种程度上更易于使用。也就是说,我们已经验证了字符串。如果解析失败,则抛出(慢)异常。
如果输入不受控制(从用户或者其他Internet来源),TryParse对我来说看起来更好。
尽量避免使用float.Parse,请改用TryParse,因为它的性能要好很多,但可以完成相同的工作。
这也适用于double,DateTime等。
(某些类型还提供了TryParseExact,它的性能甚至更好!)
来源是来自网站的输入。我不能依靠它是有效的。因此,如前所述,我选择了TryParse。
但是我不知道如何将currentCulture赋予它。
另外,这将使我了解当前正在运行的服务器的文化,但是由于它是万维网,因此用户可以来自任何地方...
由于我们不了解网络用户的文化,因此我们可以做一些猜测。使用具有分隔符和。的文化的TryParse。代表小数,并使用使用的区域性进行AND TryParse。用于分隔符,用于十进制。如果它们都成功但给出了不同的答案,则我们必须询问用户他们的意图。否则,给定两个相等的结果或者一个可用的结果或者没有可用的结果,我们可以正常进行。
我们可以通过简单的语句了解服务器的当前Cuklture:
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;
注意,这里有一个CurrentUICulture属性,但是UICulture是从ResourceMeanager形式的多语言应用程序中使用的。对于数字格式,必须考虑CurrentCulture。
我希望这能帮到我们