zoukankan      html  css  js  c++  java
  • C#字符串与常规值类型解析和格式化

    格式化是将一个对象转化为字符串,解析则是将字符串转为对象。
    在.netFramework中提供了一系列机制来处理这些操作。
    1.ToString和Parse:这两个方法是很多类型默认具有的功能
    2.格式提供器:对象上其他的ToString(以及Parse)重载方法会接受格式字符串或格式提供器。格式提供器不仅灵活而且与文化相关.Net Framework自带了数字类型和Datetime /Dattimeoffset的格式提供器
    3.XmlConvert:这个静态类提供了基于Xml标准的格式化和解析方法。如果使用文化无关的转换,或希望避免误解析时,可以使用XmlConvert作为有效的通过转换器。XmlConvert支持数字类型、bool、datetime、Dattimeoffset、TimeSpan、Guid。
    4.类转换器(Type converter):这种转换器时面向设计器XAML解析器的。

    一.ToString和Parse

    最简单的格式化字符串的机制是ToString方法,它能为所有简单的值类型(bool、DateTime(offset)、TimeSpan、Guid和所有的数字类型)产生有意的字符串输出。同时这些类型都定义了静态Parse方法来完成反向转换。

    例如:

    string s = "1";
    Console.WriteLine(s);
    Console.WriteLine("解析为int类型");
    int a = int.Parse(s);
    Console.WriteLine(a);

    如果解析S失败那么系统会抛出异常(FormatException),如果使用TryParse那么系统不会抛出异常,而时返回false

     string s = "1";
    Console.WriteLine(s);
     bool b = bool.TryParse(s, out bool isOk);
     Console.WriteLine("解析为bool类型"+isOk);

    二.格式提供器

    格式化提供器:使用格式提供器的方式是IFormatProvider接口,所有的数字类型和Datetime类型都实现了这个接口(所有的enum都可以格式化但是它们没有特殊的IFormatter类)
    .Net Framework提供了三种格式提供器NumberFormatInfo,DateTimeFormatInfo,CultureInfo

    1.格式提供器和CultureInfo

    在格式提供器的上下文中,CultureInfo扮演了根据文化的区域设置返回NumberFormatInfo和DateTimeFormatInfo两个格式提供器的间接机制。

     //使用适用于en-GB文化默认的NumberFormatInfo对象
     Console.WriteLine("使用特殊文化-英国英语");
     CultureInfo uk = CultureInfo.GetCultureInfo("en-GB");
    Console.WriteLine(3.ToString("C", uk));//这个值是根据文化变化的
     //使用不变的文化对DateTime进行格式化
    DateTime dt = new DateTime(2020, 1, 1);
    CultureInfo iv = CultureInfo.InvariantCulture;
    Console.WriteLine(dt.ToString(iv));
    Console.WriteLine(dt.ToString("d", iv));

     2.组合格式化

    组合格式字符串将变量替代符和格式字符串组合在一起。

     var s = string.Format(CultureInfo.InvariantCulture, "{0}", "测试");
     Console.WriteLine(s);
    object obj = "测试";
     string s;
     if (obj is IFormattable)
    {
        s = ((IFormattable)obj).ToString(null, 
        CultureInfo.InvariantCulture);
     }
     else if (obj == null)
     {
            s = "";
     }
      else
     {
         s = obj.ToString();
     }
     Console.WriteLine(s);

    这两段代码是能实现一样的效果。

     3.通过格式提供器进行解析

    格式提供器并未对解析提供标准结构。相反,每一个参与的类型都会重载它的静态Parse和TryParse方法接受一个格式提供器,以及一个可选的NumberStyles或DateTimeStyles枚举参数
    NumberStyles和DateTimeStyles的工作方式 :它们提供了一些自定义的设置。

    例如允许括号或者货币符号出现在输入字符串中(默认这两个选项都是false)

      int minusTwo = int.Parse("(2)", NumberStyles.Integer | NumberStyles.AllowParentheses);
    Console.WriteLine(minusTwo);

    结果返回-2;

    4.IFormatProvider和ICustomFormatter

    所有的格式提供器都是实现了IFormatProvider。这个方法提供了一种间接进行格式化的手段CultureInfo就是用它来返回何时的NumberStyles和DateTimeStyles对象并完成格式化操作的
    实现IFormatProvider和ICustomFormatter,就能编写自定义的格式提供器(该自定义格式提供器可以和现有的配合工作)

    测试文章:自定义格式提供器

    三.标准格式字符串与解析标记

    标准格式字符串决定了数字类型或Datetime(offset)转化为字符串的方式。

    标准格式字符串:提供基本的格式控制。标准格式字符串是由一个字母及其后续的可选数字组成。

    自定义格式字符串:通常使用模板对每一个字符实现精准控制。(自定义格式字符串与自定义格式提供器无关)

    1.数字格式字符串

    测试文章:标准数字格式字符串

    2.NumberStyles

    测试文章:NumberStyles

    3.Date/Time格式字符串

    DateTime/DateTimeoffset的格式字符串根据它们是否使用文化和格式提供器的设置。

    (1)DateTime的解析与误解析

    将月份或天数放在前面的日期字符串是具有二义性的,非常容易出现误解析。

    解决方法:

    1.在格式化和解析时总显示指定相同文化

    2.以一种文化无关的方式格式化DateTime和DateTimeoffset

     //演示第二种方法
                        string s = DateTime.Now.ToString("o");
                        Console.WriteLine(s);
                        DateTime dt1 = DateTime.ParseExact(s, "o", null);
                        Console.WriteLine(dt1);
                        DateTime dt2 = DateTime.Parse(s);
                        Console.WriteLine(dt2);

    4.DateTimeStyles

    DateTimeStyles是一个标记枚举类型。它可以在调用Parse的时候提供额外的指令。

    5.枚举的格式字符串

    这个直接上结果

     //枚举的格式字符串
                        Console.WriteLine(System.ConsoleColor.Red.ToString("g"));//G或g
                        Console.WriteLine(System.ConsoleColor.Red.ToString("f"));//F或f
                        Console.WriteLine(System.ConsoleColor.Red.ToString("d"));//D或d
                        Console.WriteLine(System.ConsoleColor.Red.ToString("x"));//X或x

     关于枚举后续还会有更加详细的文章介绍格式化这一块。

     欢迎加入.net学习交流群:925362372

  • 相关阅读:
    NHibernate初学者指南(12):日志
    NHibernate初学者指南(10):一级和二级缓存
    【翻译】EF 4.2 Code First 演示
    【翻译】EF 4.2 Model & Database First演示
    NHibernate初学者指南(14):配置的三种方式
    NHibernate初学者指南(16):条件查询
    NHibernate初学者指南(7):映射模型到数据库之方式三
    NHibernate初学者指南(13):监测与分析
    NHibernate初学者指南(6):映射模型到数据库之方式二
    NHibernate初学者指南(18):验证单个属性
  • 原文地址:https://www.cnblogs.com/aqgy12138/p/12679492.html
Copyright © 2011-2022 走看看