int32 的用例是什么.Parse(String, IFormatProvider) over int32.解析(字符
本文关键字:int32 IFormatProvider over 解析 字符 String 是什么 Parse | 更新日期: 2023-09-27 18:33:24
什么时候使用int32.Parse(String, IFormatProvider)
有意义?
据我所知,这个和int32.Parse(String)
无论如何都使用 NumberStyles.Integer
只允许加号、减号或数字,可以选择用空格包围,那么为什么语言环境格式会进入等式呢?
我知道大约有数千个分隔符,但它们并不重要,因为无论您所在的地区如何NumberStyles.Integer
都不允许使用它们。
考虑您是否有负号为M
(减号(的区域性。我很确定它不存在,但只要考虑到你有这样的东西。然后你可以做:
string str = "M123";
var culture = new CultureInfo("en-US");
culture.NumberFormat.NegativeSign = "M";
int number = Int32.Parse(str, culture);
这将导致-123
为值。 这是您可以使用int32.Parse(String, IFormatProvider)
重载的地方。如果未指定区域性,则它将使用当前区域性,并且对于值 M123
失败。
(旧答案(
它与带有千位分隔符的字符串很有用
考虑以下示例,
string str = "1,234,567";
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
int number = Int32.Parse(str, CultureInfo.CurrentCulture);
这将导致一个例外,因为.
是德国文化中的千位分隔符。
为
int number = Int32.Parse("1.234", NumberStyles.AllowThousands);
以上内容将成功解析,因为德国文化使用 .
作为千位分隔符。
但是,如果您将当前区域性设置为美国,那么它将给出一个例外。
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
int number = Int32.Parse("1.234", NumberStyles.AllowThousands);
请参阅: Int32.Parse 方法 (String, IFormatProvider(
提供程序参数是 IFormatProvider 实现,例如 一个 NumberFormatInfo 或 CultureInfo 对象。提供程序参数 提供有关 S 格式的区域性特定信息。如果 提供程序为 null,当前区域性的 NumberFormatInfo 对象 被使用。
那么一千个分隔符呢?我认为在美国他们使用'",",而在希腊他们使用'.">
美国: 1,000,000希腊: 1.000.000
如果其他人在 6 年后也对此感到疑惑,那么使用 Int32.ToString(IFormatProvider?)
或 Int32.Parse(String, IFormatProvider?)
仍然没有意义,因为更改文化与默认格式和NumberStyles
没有区别。
您可以运行此简单测试来验证:
using System;
using System.Globalization;
using System.Linq;
class IntToStringTest
{
static void Main()
{
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
var input = -123456789;
var defaultOutput = input.ToString();
var outputCulturePairs = cultures.Select(c => (Output: input.ToString(c), Culture: c));
var parsedOutputs = outputCulturePairs.Select(p => Int32.Parse(p.Output, p.Culture));
Console.WriteLine(outputCulturePairs.All(p => p.Output == defaultOutput));
Console.WriteLine(parsedOutputs.All(o => o == input));
}
}
编辑 8/8/2020:这仅适用于 .NET Framework。在 .NET Core 上,一些阿拉伯区域性在值后使用减号 U。