如果写 C# 时,使用了分析器,很可能会提示
string.ToString() 的行为可能因当前用户的区域设置而异
这里针对某些字符/字符串转换时出现的问题,做个列表。
IFormatProvider
这个接口用于实现字符串如何格式化转为数值类型。一般来说666
、0.666
这样的数没问题,但是使用数学符号等情况、全球化字符差异,可能会出错。
IFormatProvider 正是为了解决这些问题。
Convert.ToInt32
、 string.ToString()
将字符串/Object转为值类型时,会提示 需要 IFormatProvider
。
而 char 、byte 等则不会出现此现象。因此一方面考虑尽量不使用字符串。
只有以下两个重载会被提示需要 IFormatProvider
,需要自己实现一个 IFormatProvider
接口。
ToInt32(Object, IFormatProvider)
ToInt32(String, IFormatProvider)
使用指定的区域性特定格式信息,将指定对象的值转换为 32 位带符号整数。
NumberFormatInfo 提供用于对数字值进行格式设置和分析的区域性特定信息。
这个类型对简化字符串转换操作非常有帮助。
可以通过特定规则将各种字符串存放的各种数字形式取出来。
请查看
https://docs.microsoft.com/zh-cn/dotnet/api/system.globalization.numberformatinfo?view=netframework-4.8#properties
System.Globalization.CultureInfo.CurrentCulture
提供有关特定区域性(对于非托管代码开发,则称为“区域设置”)的信息。 这些信息包括区域性的名称、书写系统、使用的日历、字符串的排序顺序以及对日期和数字的格式化设置。
ToLwer()
等字符串操作时,需要使用到 CultureInfo
。
可以查看
https://docs.microsoft.com/zh-cn/dotnet/api/system.globalization.cultureinfo?view=netcore-3.1
一般我们可以这样
.ToLower(System.Globalization.CultureInfo.CurrentCulture)
StringComparison
将指定的 StringComparison 实例转换为 StringComparer 实例。
一般在字符串对比查找时出现。
不同方式查找对比字符串,性能有所差异,具体可以查看
https://blog.csdn.net/li5852258/article/details/70326763
一般来说,我们这样使用就行了
.Contains("a",StringComparison.CurrentCulture)
文章评论
需要注意的是,如果使用了 EFCore 等表达式树翻译,使用全球化可能会导致出错!