• [C#.NET 拾遗补漏]01:字符串操作


    字符串操作在任意编程语言的日常编程中都随处可见,今天来汇总一下 C# 中关于字符串的一些你可能遗忘或遗漏的知识点。

    逐字字符串

    在普通字符串中,反斜杠字符是转义字符。而在逐字字符串(Verbatim Strings)中,字符将被编程器按照原义进行解释。使用逐字字符串只需在字符串前面加上 @ 符号。

    // 逐字字符串:转义符
    var filename = @"c: emp ewfile.txt";
    Console.WriteLine(filenaame);

    // 逐字字符串:多行文本
    var multiLine = @"This is a
    multiline paragraph."
    ;
    Console.WriteLine(multiLine);

    // 非逐字字符串
    var escapedFilename = "c: emp ewfile.txt";
    Console.WriteLine(escapedFilename);

    输出:

    c:	emp
    ewfile.txt
    This is a
    multiline paragraph.
    c: emp
    ewfile.txt

    逐字字符串中唯一不被原样解释的字符是双引号。由于双引号是定义字符串的关键字符,所以在逐字字符串中要表达双引号需要用双引号进行转义。

    varstr = @"""I don't think so"", he said.";
    Console.WriteLine(str);
    // 输出:"I don't think so", he said.

    在逐字字符串中也可以 $ 符号实现字符串内插值。

    Console.WriteLine($@"Testing 
     1 2 {5 - 2}");
    // 输出:Testing 1 2 3

    数字格式化转换

    典型的的格式化方法为:

    string.Format("{index[:format]}", number)

    可使用“0”和“#”占位符进行补位。“0” 表示位数不够位数就补充“0”,小数部分如果位数多了则会四舍五入;“#”表示占位,用于辅助“0”进行补位。

    标准格式化用法:

    // “0”描述:占位符,如果可能,填充位
    string.Format("{0:000000}",1234); // 结果:001234

    // “#”描述:占位符,如果可能,填充位
    string.Format("{0:######}",1234); // 结果:1234
    string.Format("{0:#0####}",1234); // 结果:01234
    string.Format("{0:0#0####}",1234); // 结果:0001234

    // "."描述:小数点
    string.Format("{0:000.000}", 1234); // 结果:1234.000
    string.Format("{0:000.000}", 4321.12543); // 结果:4321.125

    // ","描述:千分表示
    string.Format("{0:0,0}", 1234567); //结果:1,234,567

    // "%"描述:格式化为百分数
    string.Format("{0:0%}",1234); // 结果:123400%
    string.Format("{0:#%}", 1234.125); // 结果:123413%
    string.Format("{0:0.00%}",1234); // 结果:123400.00%
    string.Format("{0:#.00%}",1234.125); // 结果:123412.50%

    内置快捷字母格式化用法:

    // E-科学计数法表示
    (25000).ToString("E"); // 结果:2.500000E+004

    // C-货币表示,带有逗号分隔符,默认小数点后保留两位,四舍五入
    (2.5).ToString("C"); // 结果:¥2.50

    // D[length]-十进制数
    (25).ToString("D5"); // 结果:00025

    // F[precision]-浮点数,保留小数位数(四舍五入)
    (25).ToString("F2"); // 结果:25.00

    // G[digits]-常规,保留指定位数的有效数字,四舍五入
    (2.52).ToString("G2"); // 结果:2.5

    // N-带有逗号分隔符,默认小数点后保留两位,四舍五入
    (2500000).ToString("N"); // 结果:2,500,000.00

    // X-十六进制,非整型将产生格式异常
    (255).ToString("X"); // 结果:FF

    ToString 也可以自定义补零格式化:

    (15).ToString("000");              // 结果:015
    (15).ToString("value is 0"); // 结果:value is 15
    (10.456).ToString("0.00"); // 结果:10.46
    (10.456).ToString("00"); // 结果:10
    (10.456).ToString("value is 0.0"); // 结果:value is 10.5

    转换为二进制、八进制、十六进制输出:

    int number = 15;
    Convert.ToString(number, 2); // 结果:1111
    Convert.ToString(number, 8); // 结果:17
    Convert.ToString(number, 16); // 结果:f

    自定义格式化器:

    public class CustomFormat : IFormatProvider, ICustomFormatter
    {
    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
    if (!this.Equals(formatProvider))
    {
    return null;
    }
    if (format == "Reverse")
    {
    return string.Join("", arg.ToString().Reverse());
    }
    return arg.ToString();
    }

    public object GetFormat(Type formatType)
    {
    return formatType == typeof(ICustomFormatter) ? this : null;
    }
    }

    使用自定义格式化器:

    String.Format(newCustomFormat(), "-> {0:Reverse} <-", "Hello World");
    // 输出:-> dlroW olleH <-

    字符串拼接

    将数组中的字符串拼接成一个字符串:

    var parts = new[] { "Foo", "Bar", "Fizz", "Buzz"};
    var joined = string.Join(", ", parts);
    // joined = "Foo, Bar, Fizz, Buzz"

    以下四种方式都可以达到相同的字符串拼接的目的:

    string first = "Hello";
    string second = "World";
    string foo = first + " " + second;
    string foo = string.Concat(first, " ", second);
    string foo = string.Format("{0} {1}", firstname, lastname);
    string foo = $"{firstname} {lastname}";

    字符串内插法

    简单用法:

    var name = "World";
    var str =$"Hello, {name}!";
    // str = "Hello, World!"

    带日期格式化:

    var date = DateTime.Now;
    var str = $"Today is {date:yyyy-MM-dd}!";

    补齐格式化(Padding):

    var number = 42;

    // 向左补齐
    var str = $"The answer to life, the universe and everything is {number, 5}.";
    // str = "The answer to life, the universe and everything is ___42." ('_'表示空格)

    // 向右补齐
    var str = $"The answer to life, the universe and everything is ${number, -5}.";
    // str = "The answer to life, the universe and everything is 42___."

    结合内置快捷字母格式化:

    var amount = 2.5;
    var str = $"It costs {amount:C}";
    // str = "¥2.50"

    var number = 42;
    var str = $"The answer to life, the universe and everything is {number, 5:f1}.";
    // str = "The answer to life, the universe and everything is ___42.1"

    参考:

    1.《C# 7.0 in a Nutshell》

    2. https://bit.ly/2U1eIK9

  • 相关阅读:
    日志管理工具logrotate
    springboot2整合logback.xml动态修改日志打印级别
    mybatis框架之装饰模式
    mybatis源码分析之06二级缓存
    后勤信息反馈---场景描述
    《人月神话》读后感---计算机产品的文档
    android studio 使用第三方模拟器连接方法
    第八周总结
    Android Studio 和 SDK 下载、安装和环境变量配置
    求最大子数组并单步显示
  • 原文地址:https://www.cnblogs.com/willick/p/13035697.html
Copyright © 2020-2023  润新知