解析浮点数的最佳方法?

时间:2008-09-29 07:23:44

标签: c# parsing floating-point currentculture

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

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

11 个答案:

答案 0 :(得分:47)

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

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

答案 1 :(得分:25)

取决于输入的来源。

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

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

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

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:6)

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

例如:

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:1)

传入CultureInfoNumberFormatInfo,代表您想要解析浮动的文化;这可以控制用于小数,字符分隔符等的字符。

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

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

我希望这会对你有所帮助

答案 9 :(得分: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;

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

答案 10 :(得分:-1)

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