何时使用int32.Parse(String, IFormatProvider)
?
据我所知,这个和int32.Parse(String)
使用NumberStyles.Integer
无论如何只允许加号,减号或数字,可选择用空格包围,那么为什么语言环境格式会进入方程?
我知道有一千个分隔符,但它们并不重要,因为NumberStyles.Integer
无论你所在的地区都不允许它们。
答案 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上,某些阿拉伯文化在该值之后使用减号。