在 CSharp 中解析浮点数的最佳方法是什么?我知道 TryParse,但我特别想知道的是点、逗号等。
我的网站有问题。在我的开发服务器上,“,”代表小数,“。” 为分隔符。但是在产品服务器上,情况正好相反。我怎样才能最好地捕捉到这一点?
在 CSharp 中解析浮点数的最佳方法是什么?我知道 TryParse,但我特别想知道的是点、逗号等。
我的网站有问题。在我的开发服务器上,“,”代表小数,“。” 为分隔符。但是在产品服务器上,情况正好相反。我怎样才能最好地捕捉到这一点?
我同意leppie的回答;用代码来表示:
string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
取决于输入的来源。
如果您的输入来自用户,您应该使用用户/页面正在使用的 CultureInfo ( Thread.CurrentThread.CurrentUICulture )。
您可以通过查看HttpRequest.UserLanguages属性来获取和指示用户的文化。(不是 100% 正确,但我发现这是一个很好的初步猜测)有了这些信息,您可以在页面开头设置Thread.CurrentThread.CurrentUICulture 。
如果您的输入来自内部来源,您可以使用InvariantCulture来解析字符串。
如果您的输入来自受控源,则 Parse 方法更易于使用。也就是说,您已经验证了字符串。如果失败,Parse 会抛出(慢)异常。
如果输入不受控制,(来自用户或其他 Internet 来源)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);
您总是可以使用Parse的重载,其中包括要使用的文化?
例如:
double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting
如果您可以控制所有数据,则应在所有代码中使用“CultureInfo.InvariantCulture”。
使用 Try/Parse 解析时使用中性文化(或您知道的文化)。
传入一个CultureInfo或NumberFormatInfo,它代表您要将浮点数解析为的文化;这控制了用于小数、组分隔符等的字符。
例如确保'.' 字符被视为您可以在 CultureInfo.InvariantCulture 中传递的十进制指示符(这在服务器应用程序中通常非常有用,您倾向于希望事物保持相同而与环境的文化无关)。
尽量避免使用 float.Parse,改用 TryParse,因为它的性能要好得多,但工作相同。这也适用于 double、DateTime 等...
(某些类型还提供 TryParseExact,它的性能也更好!)
来源是来自网站的输入。我不能相信它是有效的。因此,如前所述,我选择了 TryParse。但我不知道如何给它 currentCulture。
此外,这会给我它当前运行的服务器的文化,但由于它是万维网,用户可以来自任何地方......
您可以通过一个简单的语句了解您服务器的当前 Cuklture:
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;
请注意,有一个 CurrentUICulture 属性,但 UICulture 是从 ResourceMeanager 表单多语言应用程序中使用的。对于数字格式,您必须考虑 CurrentCulture。
我希望这能帮到您
一种方法是强制本地化使用点而不是逗号分隔符 - 这样您的代码将在所有 Windows 机器上以相同的方式工作,而与所选语言和设置无关。
这种方法适用于小型应用程序,如测试应用程序、控制台应用程序等。对于使用本地化的应用程序,这不是很有用,但取决于应用程序的要求。
var CurrentCultureInfo = new CultureInfo("en", false);
CurrentCultureInfo.NumberFormat.NumberDecimalSeparator = ".";
CurrentCultureInfo.NumberFormat.CurrencyDecimalSeparator = ".";
Thread.CurrentThread.CurrentUICulture = CurrentCultureInfo;
Thread.CurrentThread.CurrentCulture = CurrentCultureInfo;
CultureInfo.DefaultThreadCurrentCulture = CurrentCultureInfo;
此代码强制使用点 ( '.'
) 而不是逗号,需要在应用程序启动时放置。
由于您不了解网络用户的文化,您可以做一些猜测。TryParse 具有使用 , 作为分隔符和 . 对于十进制,并且 TryParse 具有使用 . 用于分隔符, , 用于小数。如果他们都成功但产生不同的答案,那么您将不得不询问用户他们的意图。否则,你可以正常进行,给定两个相等的结果或一个可用的结果或没有可用的结果。