字串操作在任意程式語言的日常程式設計中都隨處可見,今天來彙總一下 C# 中關於字串的一些你可能遺忘或遺漏的知識點。
逐字字串
在普通字串中,反斜槓字元是轉義字元。而在逐字字串(Verbatim Strings)中,字元將被程式設計器按照原義進行解釋。使用逐字字串只需在字串前面加上 @ 符號。
// 逐字字串:轉義符
var filename = @"c:\temp\newfile.txt";
Console.WriteLine(filenaame);
// 逐字字串:多行文字
var multiLine = @"This is a
multiline paragraph.";
Console.WriteLine(multiLine);
// 非逐字字串
var escapedFilename = "c:\temp\newfile.txt";
Console.WriteLine(escapedFilename);
輸出:
c:\temp\newfile.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 \n 1 2 {5 - 2}");
// 輸出:Testing \n 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