44

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

我的网站有问题。在我的开发服务器上,“,”代表小数,“。” 为分隔符。但是在产品服务器上,情况正好相反。我怎样才能最好地捕捉到这一点?

4

11 回答 11

56

我同意leppie的回答;用代码来表示:

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
于 2008-09-29T07:30:13.773 回答
26

取决于输入的来源。

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

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

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

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

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

于 2008-09-29T07:31:11.120 回答
7

如果您想为内部目的保留值(数字、日期、时间等)。每次使用“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);
于 2008-09-29T07:28:37.927 回答
6

您总是可以使用Parse的重载,其中包括要使用的文化?

例如:

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

如果您可以控制所有数据,则应在所有代码中使用“CultureInfo.InvariantCulture”。

于 2008-09-29T07:30:45.580 回答
3

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

于 2008-09-29T07:26:56.697 回答
1

传入一个CultureInfoNumberFormatInfo,它代表您要将浮点数解析为的文化;这控制了用于小数、组分隔符等的字符。

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

于 2008-09-29T07:29:42.247 回答
0

尽量避免使用 float.Parse,改用 TryParse,因为它的性能要好得多,但工作相同。这也适用于 double、DateTime 等...

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

于 2008-09-29T07:37:54.643 回答
0

来源是来自网站的输入。我不能相信它是有效的。因此,如前所述,我选择了 TryParse。但我不知道如何给它 currentCulture。

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

于 2008-09-30T07:59:48.250 回答
0

您可以通过一个简单的语句了解您服务器的当前 Cuklture:

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

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

我希望这能帮到您

于 2008-09-30T08:26:20.043 回答
0

一种方法是强制本地化使用点而不是逗号分隔符 - 这样您的代码将在所有 Windows 机器上以相同的方式工作,而与所选语言和设置无关。

这种方法适用于小型应用程序,如测试应用程序、控制台应用程序等。对于使用本地化的应用程序,这不是很有用,但取决于应用程序的要求。

var CurrentCultureInfo = new CultureInfo("en", false);
CurrentCultureInfo.NumberFormat.NumberDecimalSeparator = ".";
CurrentCultureInfo.NumberFormat.CurrencyDecimalSeparator = ".";
Thread.CurrentThread.CurrentUICulture = CurrentCultureInfo;
Thread.CurrentThread.CurrentCulture = CurrentCultureInfo;
CultureInfo.DefaultThreadCurrentCulture = CurrentCultureInfo;

此代码强制使用点 ( '.') 而不是逗号,需要在应用程序启动时放置。

于 2021-03-19T07:20:11.137 回答
-1

由于您不了解网络用户的文化,您可以做一些猜测。TryParse 具有使用 , 作为分隔符和 . 对于十进制,并且 TryParse 具有使用 . 用于分隔符, , 用于小数。如果他们都成功但产生不同的答案,那么您将不得不询问用户他们的意图。否则,你可以正常进行,给定两个相等的结果或一个可用的结果或没有可用的结果。

于 2008-09-30T08:24:23.260 回答