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都不允许使用它们。

int32 的用例是什么.Parse(String, IFormatProvider) over int32.解析(字符

考虑您是否有负号为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。

相关文章: