字符串操作

原创 精致码农 2020-06-03 04:15:00
字符串操作在任意编程语言的日常编程中都随处可见,今天来汇总一下 C# 中关于字符串的一些你可能遗忘或遗漏的知识点。

逐字字符串

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

  1. // 逐字字符串:转义符
  2. var filename = @"c:\temp\newfile.txt";
  3. Console.WriteLine(filenaame);
  4. // 逐字字符串:多行文本
  5. var multiLine = @"This is a
  6. multiline paragraph.";
  7. Console.WriteLine(multiLine);
  8. // 非逐字字符串
  9. var escapedFilename = "c:\temp\newfile.txt";
  10. Console.WriteLine(escapedFilename);

输出:

  1. c:\temp\newfile.txt
  2. This is a
  3. multiline paragraph.
  4. c: emp
  5. ewfile.txt

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

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

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

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

数字格式化转换

典型的的格式化方法为:

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

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

  1. // “0”描述:占位符,如果可能,填充位
  2. string.Format("{0:000000}",1234); // 结果:001234
  3. // “#”描述:占位符,如果可能,填充位
  4. string.Format("{0:######}",1234); // 结果:1234
  5. string.Format("{0:#0####}",1234); // 结果:01234
  6. string.Format("{0:0#0####}",1234); // 结果:0001234
  7. // "."描述:小数点
  8. string.Format("{0:000.000}", 1234); // 结果:1234.000
  9. string.Format("{0:000.000}", 4321.12543); // 结果:4321.125
  10. // ","描述:千分表示
  11. string.Format("{0:0,0}", 1234567); //结果:1,234,567
  12. // "%"描述:格式化为百分数
  13. string.Format("{0:0%}",1234); // 结果:123400%
  14. string.Format("{0:#%}", 1234.125); // 结果:123413%
  15. string.Format("{0:0.00%}",1234); // 结果: 123400.00%
  16. string.Format("{0:#.00%}",1234.125); // 结果:123412.50%

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

  1. // E-科学计数法表示
  2. (25000).ToString("E"); // 结果:2.500000E+004
  3. // C-货币表示,带有逗号分隔符,默认小数点后保留两位,四舍五入
  4. (2.5).ToString("C"); // 结果:¥2.50
  5. // D[length]-十进制数
  6. (25).ToString("D5"); // 结果:00025
  7. // F[precision]-浮点数,保留小数位数(四舍五入)
  8. (25).ToString("F2"); // 结果:25.00
  9. // G[digits]-常规,保留指定位数的有效数字,四舍五入
  10. (2.52).ToString("G2"); // 结果:2.5
  11. // N-带有逗号分隔符,默认小数点后保留两位,四舍五入
  12. (2500000).ToString("N"); // 结果:2,500,000.00
  13. // X-十六进制,非整型将产生格式异常
  14. (255).ToString("X"); // 结果:FF

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

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

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

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

自定义格式化器:

  1. public class CustomFormat : IFormatProvider, ICustomFormatter
  2. {
  3. public string Format(string format, object arg, IFormatProvider formatProvider)
  4. {
  5. if (!this.Equals(formatProvider))
  6. {
  7. return null;
  8. }
  9. if (format == "Reverse")
  10. {
  11. return string.Join("", arg.ToString().Reverse());
  12. }
  13. return arg.ToString();
  14. }
  15. public object GetFormat(Type formatType)
  16. {
  17. return formatType == typeof(ICustomFormatter) ? this : null;
  18. }
  19. }

使用自定义格式化器:

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

字符串拼接

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

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

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

  1. string first = "Hello";
  2. string second = "World";
  3. string foo = first + " " + second;
  4. string foo = string.Concat(first, " ", second);
  5. string foo = string.Format("{0} {1}", first, lastname);
  6. string foo = $"{first} {second}";

字符串内插法

简单用法:

  1. var name = "World";
  2. var str =$"Hello, {name}!";
  3. // str = "Hello, World!"

带日期格式化:

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

补齐格式化(Padding):

  1. var number = 42;
  2. // 向左补齐
  3. var str = $"The answer to life, the universe and everything is {number, 5}.";
  4. // str = "The answer to life, the universe and everything is ___42." ('_'表示空格)
  5. // 向右补齐
  6. var str = $"The answer to life, the universe and everything is ${number, -5}.";
  7. // str = "The answer to life, the universe and everything is 42___."

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

  1. var amount = 2.5;
  2. var str = $"It costs {amount:C}";
  3. // str = "¥2.50"
  4. var number = 42;
  5. var str = $"The answer to life, the universe and everything is {number, 5:f1}.";
  6. // str = "The answer to life, the universe and everything is ___42.1"