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

我的网站出现问题。在我的开发服务器上,','代表小数,'。'用于分隔符。但是在prod服务器上,它是相反的。 我怎样才能最好地捕捉到它?

有帮助吗?

解决方案

取决于输入的来源。

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

您可以通过查看 HttpRequest.UserLanguages 属性。 (不正确100%,但我发现它是一个非常好的第一个猜测)有了这些信息,你可以设置 Thread.CurrentThread.CurrentUICulture

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

如果输入来自受控源,则Parse方法更容易使用。也就是说,您已经验证了字符串。如果Parse失败,Parse会抛出(慢)异常。

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

其他提示

我同意leppie的回复;把它放在代码方面:

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”。在你的所有代码中。

如果您想将持久值(数字,日期,时间等)用于内部目的。每次都使用“InvariantCulture”和“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);

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

传入 CultureInfo NumberFormatInfo ,表示要将浮动解析为的文化;这可以控制用于小数,字符分隔符等的字符。

例如确保'。' character被视为您可以在CultureInfo.InvariantCulture中传递的十进制指示符(这一点在服务器应用程序中非常有用,在这些服务器应用程序中,无论环境文化如何,您都希望事物相同。)

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

(某些类型还提供TryParseExact,它的表现也更好!)

来源是网站的输入。我不能依赖它是有效的。所以我和之前提到的TryParse一起去了。 但我无法弄清楚如何将当前的文化赋予它。

此外,这将为我提供当前正在运行的服务器的文化,但由于它是万维网,用户可以来自任何地方......

您可以通过简单的声明了解服务器的当前Cuklture:

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

请注意,它有一个CurrentUICulture属性,但是从ResourceMeanager表单多语言应用程序中使用UICulture。对于数字格式,你必须考虑CurrentCulture。

我希望这会对你有所帮助

由于您不了解网络用户的文化,您可以做一些猜测。 TryParse的文化使用,分隔符和。 for decimal,和TryParse使用的文化。用于分隔符,用于小数。如果它们都成功但产生不同的答案,那么你将不得不问用户他们想要的是什么。否则,您可以正常进行,给出两个相同的结果或一个可用的结果或没有可用的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top