C# CultureInfo之常用InvariantCulture案例详解

1、CultureInfo的InvariantCulture的作用

(1)、CultureInfo使整个.NET Framework更加人性化,因为这可以使同一个数据适应不同地区和文化,这样当然满足处于不同地区和文化的用户。但前提是数据给“人”看,如果这些数据用于计算机之间的传输,即给“机器”看,这样的多文化处理反而不妥,造成同一个数据的不同展现形式,尤其是读写两方的文化地区不同时,数据可能根本无法被正常读取或者产生潜在bug,因此这里,正是InvariantCulture的用武之地。

(2)、当进行数字,日期时间,字符串匹配时,都会进行CultureInfo的操作,也就是不同的CultureInfo下,这些操作的结果可能会不一样。这里要介绍一下非常容易被忽视InvariantCulture。

2、使用场景

你编写一个程序,要向数据中心服务器传递一些时间数据,你会怎么写?直接DateTime.ToString()?那你就大错特错了,下面用代码,举个非常形象的例子。在一个控制台里,模拟数据中心,然后放出多个线程,模拟客户端程序传递数据。

static readonly string[] CultureSources = { "en-us", "zh-cn", "ar-iq", "de-de" };
        static readonly Random Ran = new Random(Environment.TickCount);
        static void Main()
        {
            Console.WriteLine("数据中心开始接受客户端数据:");
            for (int i = 0; i < CultureSources.Length; i++)
                ThreadPool.QueueUserWorkItem(Client, i);
            Console.ReadKey(true);

            Console.WriteLine("");
            Console.WriteLine("数据中心:…………");
        }

        static void Client(object obj)
        {
            int id = (int)obj;
            Thread.Sleep(Ran.Next(1000));

            CultureInfo cul = CultureInfo.GetCultureInfo(CultureSources[id]);
            Thread.CurrentThread.CurrentCulture = cul;
            Console.WriteLine("某客户端操作系统语言设置{0}\n传送数据:{1}\n", cul.DisplayName, new DateTime(1990, 10, 27).ToShortDateString());
        }

同样的DateTime.ToShortDateString(),在英语-美国,中文-中国,阿拉伯语-伊拉克和德语-德国的不同环境下,1990年10月27日竟然有如此不同的输出结果,这些数据让数据中心服务器情何以堪啊!!!

造成这个情况的原因是:在进行日期时间输出时,.NET会考虑当前线程的CultureInfo,即Thread.CurrentThread.CurrentCulture(或者CultureInfo.CurrentCulture),并根据CultureInfo,进行相应地区文化的数据处理。注意不要和UICulture混淆。

解决方案就是使用这个特殊的InvariantCulture.解决代码如下:

Console.WriteLine("某客户端操作系统语言设置{0}\n传送数据:{1}\n", cul.DisplayName, new DateTime(1990, 10, 27).ToString(CultureInfo.InvariantCulture.DateTimeFormat.ShortDatePattern, CultureInfo.InvariantCulture));

ok,这样不管客户端运行在什么语言环境下,输出的时间格式都是统一的,方面数据中心服务器对数据做后续处理。这样所有的输出结果都保持一致了。

到此这篇关于C# CultureInfo之常用InvariantCulture案例详解的文章就介绍到这了,更多相关C# CultureInfo之常用InvariantCulture内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# XmlDocument操作XML案例详解

    C# XmlDocument操作XML XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized  Markup Language,标准通用标记语言).它没有标签集(tag set),也没有语法规则(grammatical rule),但是它有句法规则(syntax rule). 任何XML文档对任何类型的应用以及正确的解析都必须是良构的(well-formed),即每一个打开

  • C# DateTime.Compare()方法案例详解

    C#中的DateTime.Compare()方法用于比较两个DateTime实例.它返回一个整数值, <0-如果date1早于date2 0-如果date1与date2相同 > 0-如果date1晚于date2 语法 以下是语法- public static int Compare (DateTime d1, DateTime d2); 上面的d1和d2是要比较的两个日期. 示例 现在让我们看一个实现DateTime.Compare()方法的示例- using System; public c

  • C# pictureBox用法案例详解

    PictureBox 控件可以显示来自位图.图标或者元文件,以及来自增强的元文件.JPEG 或 GIF 文件的图形.如果控件不足以显示整幅图象,则裁剪图象以适应控件的大小. 本文利用openfiledialog控件实现图片文件的打开: 展示了图片控件的sizeMode四种格式:最好的应该是zoom,在图片不发生形变的条件下,对图片进行缩放. sizemode:autosize–让picturebox适应图片尺寸,zoom–让图片适应picturebox 控件的SizeMode属性,有四种情况:

  • C# InitializeComponent()方法案例详解

    在每一个窗体生成的时候,都会针对于当前的窗体定义InitializeComponent()方法,该方法实际上是由系统生成的对于窗体界面的定义方法. //位于.cs文件之中的InitializeComponent()方法 public Form011() { InitializeComponent(); } 在每一个Form文件建立后,都会同时产生程序代码文件.CS文件,以及与之相匹配的.Designer.CS文件,业务逻辑以及事件方法等被编写在.CS文件之中,而界面设计规则被封装在.Design

  • C# DialogResult用法案例详解

    在程序中,经常会弹出一个对话框来让用户填写一些信息,填写完成后,当用户点击"确定"按钮后,在主窗体中进行其他的处理.比如一个简单的例子,在主窗体中有一个菜单,是"增加用户",当点击这个菜单之后,我们需要弹出一个增加用户的窗体出来,就假设"增加用户"的窗体叫frmAddUser,那么代码如下: frmAddUser frm = new frmAddUser(); if (frm.ShowDialog() == DialogResult.OK) {

  • C# CultureInfo之常用InvariantCulture案例详解

    1.CultureInfo的InvariantCulture的作用 (1).CultureInfo使整个.NET Framework更加人性化,因为这可以使同一个数据适应不同地区和文化,这样当然满足处于不同地区和文化的用户.但前提是数据给"人"看,如果这些数据用于计算机之间的传输,即给"机器"看,这样的多文化处理反而不妥,造成同一个数据的不同展现形式,尤其是读写两方的文化地区不同时,数据可能根本无法被正常读取或者产生潜在bug,因此这里,正是InvariantCul

  • SpringBoot实现WEB的常用功能案例详解

    目录 前言 SpringMVC整合支持 Spring MVC自动配置 项目基础环境搭建 功能扩展实现 Spring MVC功能扩展实现 Spring整合Servlet三大组件 使用注册方式整合 使用组件注册方式整合Servlet 使用组件注册方式整合Filter 使用组件注册方式整合 Listener 文件上传与下载 文件上传 编写上传表单界面 编写控制器 文件下载 添加依赖 下载处理控制器 编写前端代码 SpringBoot的打包部署 jar包形式打包 启动jar包 war包形式打包 war包

  • C# CultureInfo类案例详解

    c#中的CultureInfo类 CultureInfo类位于System.Globalization命名空间内,这个类和命名空间许多人都不是很熟悉,实际我们在写程序写都经常间接性的接触这个类,当进行数字,日期时间,字符串匹配时,都会进行CultureInfo的操作,也就是说,也就是不同的CultureInfo下,这些操作的结果可能会不一样,由于我们大部分开发部署都是在同一种语言环境中,平日里可能没有感觉到它的用处,如果你的开发的项目是给国外用户用的,有可能在你机器上运行输出是一种效果,在客户机

  • Kotlin常用函数let,with,run,apply用法与区别案例详解

    在kotlin编程中let.with.run.apply这些函数使用率是非常高的,有时候可以通用,差别很小,但如果能记住他们的不同点,可以更加合理的选择使用. 在这之前首先要了解一下Lambda表达式的一些规则,这会帮助你理解使用这些函数的时候有没有( )可不可以用it代替参数等.因为这些函数的最后一个参数都是lambda. 如何理解lambda呢?可以把lambda理解为就是一个对象,但这个对象比较特殊,它是一段代码,既然是对象就可以作为函数的参数使用.这种对象称为函数对象. lambda表达

  • sass 常用备忘案例详解

    一.变量 所有变量以$开头 $font_size: 12px; .container{ font-size: $font_size; } 如果变量嵌套在字符串中,需要写在#{}中 $side : left; .rounded { border-#{$side}: 1px solid #000; } 二.嵌套 层级嵌套 .container{ display: none; .header{ width: 100%; } } 属性嵌套,注意,border后需要加上冒号: .container { b

  • python爬虫系列网络请求案例详解

    学习了之前的基础和爬虫基础之后,我们要开始学习网络请求了. 先来看看urllib urllib的介绍 urllib是Python自带的标准库中用于网络请求的库,无需安装,直接引用即可. 主要用来做爬虫开发,API数据获取和测试中使用. urllib库的四大模块: urllib.request: 用于打开和读取url urllib.error : 包含提出的例外,urllib.request urllib.parse:用于解析url urllib.robotparser:用于解析robots.tx

  • Python实现OCR识别之pytesseract案例详解

    Python实现OCR识别:pytesseract Python常用pytesseract进行图片上的文字识别,即OCR识别,完整的代码比较简单,只要下面一行即可,但是实际使用时环境配置上容易出错. from PIL import Image import pytesseract text = pytesseract.image_to_string(Image.open('/Users/alice/Documents/Develop/PythonCode/textinphoto.PNG')) p

  • PHP八大设计模式案例详解

    PHP命名空间 可以更好地组织代码,与Java中的包类似. Test1.php <?php namespace Test1;//命名空间Test1 function test(){ echo __FILE__; } Test2.php <?php namespace Test2; //命名空间Test2 function test(){ echo __FILE__;//打印当前文件所在的绝对路径. } Test.php <?php require 'Test1.php'; require

  • Java之Jackson使用案例详解

    序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. Json是什么? Jason是 JavaScript Object Notation-  JavaScript对象表示法,是一种轻量级数据交换格式.主要用于数据传输,比如说在后端写了一个Java对象,想在其他地方(前端)使用这个对象,就需要转换为Json这种形式进行传输. 1.

  • Java BigDecimal案例详解

    引言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦. 先看下面代码 public static void main(String[] args) { System.out.println(0.2 + 0.1); System.out.printl

随机推荐