int32.Parse(String,IFormatProvider)对int32.Parse(String)的用例是什么?

时间:2013-10-01 14:07:24

标签: c#

何时使用int32.Parse(String, IFormatProvider)

是否合理

据我所知,这个和int32.Parse(String)使用NumberStyles.Integer无论如何只允许加号,减号或数字,可选择用空格包围,那么为什么语言环境格式会进入方程?

我知道有一千个分隔符,但它们并不重要,因为NumberStyles.Integer无论你所在的地区都不允许它们。

3 个答案:

答案 0 :(得分:8)

考虑一下你的文化中负号为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 Method (String, IFormatProvider)

  

provider参数是IFormatProvider实现,等   NumberFormatInfo或CultureInfo对象。提供者参数   提供有关s格式的特定文化信息。如果   provider为null,是当前区域性的NumberFormatInfo对象   使用。

答案 1 :(得分:2)

千分离器怎么样? 我认为在美国他们使用','在希腊,他们使用' 美国:1,000,000 希腊:1.000.000

答案 2 :(得分:0)

如果其他人也想知道这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上,某些阿拉伯文化在该值之后使用减号。