C# 全球化

2020年2月26日 3901点热度 3人点赞 4条评论
内容纲要

如果写 C# 时,使用了分析器,很可能会提示

string.ToString() 的行为可能因当前用户的区域设置而异

这里针对某些字符/字符串转换时出现的问题,做个列表。

IFormatProvider

这个接口用于实现字符串如何格式化转为数值类型。一般来说6660.666 这样的数没问题,但是使用数学符号等情况、全球化字符差异,可能会出错。
IFormatProvider 正是为了解决这些问题。

Convert.ToInt32string.ToString()将字符串/Object转为值类型时,会提示 需要 IFormatProvider

而 char 、byte 等则不会出现此现象。因此一方面考虑尽量不使用字符串。

只有以下两个重载会被提示需要 IFormatProvider,需要自己实现一个 IFormatProvider 接口。

ToInt32(Object, IFormatProvider)
ToInt32(String, IFormatProvider)
使用指定的区域性特定格式信息,将指定对象的值转换为 32 位带符号整数。

可以查看
https://docs.microsoft.com/zh-cn/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Object_System_IFormatProvider_

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)

痴者工良

高级程序员劝退师

文章评论

  • whuanle

    需要注意的是,如果使用了 EFCore 等表达式树翻译,使用全球化可能会导致出错!

    2020年2月26日