C#內插字串,格式化字串
阿新 • • 發佈:2022-05-19
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
格式字串
在使用write
或writeline
時可以有一個或以上的引數
- 如果不止一個引數,引數間使用逗號分隔
- 第一個引數必須是字串,稱為
格式字串
,輸出串中可以包含替代標記
- 替代標記在格式字串中標出位置,輸出中將用一個值進行替代
- 替代標記由
花括號{}
和一個整數
組成,其中整數是替換值的數字位置
,替換值的位置從0
例子
複製程式碼- 1
- 2
- 3
- 4
string name = "hahaha";
int simple = 10;
Console.WriteLine("Hello, World! {0} | {1}", name, simple);
輸出
複製程式碼- 1
Hello, World! hahaha | 10
索引越界
複製程式碼- 1
- 2
- 3
- 4
string name = "hahaha";
int simple = 10;
Console.WriteLine("Hello, World! {0} | {2}", name, simple);
異常提示
複製程式碼- 1
Unhandled exception. System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
字串插值
C#6.0 引入了字串插值
它是通過直接替代字串中的替代標記
進行的,這種方式更加方便並且符合閱讀習慣
- 使用字串差值時 字串前必須新增
$
標記
例子
複製程式碼- 1
- 2
- 3
- 4
string name = "hahaha";
int simple = 10;
Console.WriteLine($"Hello, World! {name} | {simple}");
輸出
複製程式碼- 1
Hello, World! hahaha | 10
格式化字串
標準數字格式說明符
C#提供了很多方便的說明符對字元進行格式化
複製程式碼- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
string name = "hahaha";
int positiveInt= 110;
long bigInt = 123456789;
int decimalInt = -10;
double price = 12.5;
float pricef = -12.543553f;
double general = 4.123456789123456789;
double percentage = 0.123456789;
名稱 | 字元 | 意義 | 示例 |
---|---|---|---|
貨幣 | C,c | 使用貨幣符號把值格式化為貨幣,符號取決於程式所在的PC所在區域 格式 {C/c{精度說明符}( 小數位數 ) |
Console.WriteLine("{0:c4}", price); Console.WriteLine($"{price:C5}"); 輸出 ¥12.5000 ¥12.50000 |
十進位制數 | D,d | 十進位制字串,負數時有負號 格式 {D/d{精度說明符}( 補零位數 ) |
Console.WriteLine("十進位制數: {0:d8}", decimalInt); Console.WriteLine($"十進位制數: {decimalInt:D5}"); 輸出 -00000010 -00010 |
浮點數 | F,f | 浮點數,負數時有負號 格式 {F/f{精度說明符}( 小數位數 ) |
Console.WriteLine("浮點數 float: {0:f4}", pricef); Console.WriteLine($"浮點數 double: {price:f5}"); 輸出 -12.5433 12.50000 |
常規(未指定) | G,g | 未指定或指定為G/g時,會根據值型別轉換,浮點數時依然會四捨五入 格式 {G/g{精度說明符( 小數位數 )} |
Console.WriteLine("常規: {0:g5}", general); Console.WriteLine($"常規: {general:g}", general); 輸出 4.1235 4.123456789123456 |
十六進位制 | X,x | 轉換為十六進位制,字元大小寫會改變十六進位制字串的大小寫 精度如果大於長度會在前面補零,精度不夠會超過精度限制 格式 {X/x{精度說明符( 補零位數 )} |
Console.WriteLine("十六進位制: {0:X4}", decimalInt); Console.WriteLine($"十六進位制 {positiveInt:x6}"); 輸出 FFFFFFF6 00006e |
數字 | N,n | 轉換浮點數輸出,並且會在位數之間加入, 具體是, 還是空格 根據設定的區域而定格式 {X/x{精度說明符( 小數位數 )} |
Console.WriteLine("數字: {0:N}", general); Console.WriteLine($"數字: {bigInt:N5}"); 輸出 4.12 123,456,789.00000 |
百分比 | P,p | 轉換為百分比輸出,預設保留兩位 不足的地方會四捨五入 格式 {P/p{精度說明符( 小數位數 )} |
Console.WriteLine("百分比: {0:P}", percentage); Console.WriteLine($"百分比: {percentage:p4}"); 輸出 12.35% 12.3457% |
原始值 | R,r | 如果之後用Parse 轉換為數字,保證其和原始值相同格式 {R/r{精度說明符( 忽略,不起作用 )} |
Console.WriteLine("原始值: {0:R}", general); Console.WriteLine($"原始值: {general:r9}"); 輸出 4.123456789123456 4.123456789123456 |
科學計數法 | E,e | 轉換為科學計數法,大小寫和字元保持一致 精度不夠時四捨五入 格式 {R/r{精度說明符( 小數位數 )} |
Console.WriteLine("科學計數法: {0:E4}", general); Console.WriteLine($"科學計數法: {general:E6}"); 輸出 4.1235E+000 4.123457E+000 |
對齊說明符
對齊說明符表示欄位中字元的最小寬度
如果不進行對齊我們的程式碼會輸出這樣的結果
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
貨幣符號: ¥12.5000
貨幣符號: ¥12.50000
十進位制數: -00000010
十進位制數: -00010
浮點數 float: -12.5436
浮點數 double: 12.50000
常規: 4.1235
常規: 4.123456789123456
十六進位制: FFFFFFF6
十六進位制 00006e
十六進位制 6e
數字: 4.12
數字: 123,456,789.00000
百分比: 12.35%
百分比: 12.3457%
原始值: 4.123456789123456
原始值: 4.123456789123456
科學計數法: 4.1235E+000
科學計數法: 4.123457E+000
對於強迫症來說這肯定不能接受啊
來一段程式碼說明對齊說明符
複製程式碼- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Console.WriteLine("對齊說明符: |{0, 10}|", positiveInt);
Console.WriteLine("對齊說明符: |{0, -10}|", positiveInt);
Console.WriteLine($"對齊說明符: |{positiveInt, 10}|");
Console.WriteLine($"對齊說明符: |{positiveInt, -10}|");
Console.WriteLine("對齊說明符: |{0, 10:f11}|", percentage);
Console.WriteLine("對齊說明符: |{0, -10:f4}|", percentage);
輸出
複製程式碼- 1
- 2
- 3
- 4
- 5
- 6
對齊說明符: | 110|
對齊說明符: |110 |
對齊說明符: | 110|
對齊說明符: |110 |
對齊說明符: |0.12345678900|
對齊說明符: |0.1235 |
- 正數表示右對齊,負數表示左對齊
- 如果字元超出了限制的字元,則原限制失效
- 在對齊基礎上可以增加格式說明符 格式
{{變數}, {字元長度}:{格式說明符}}
內插字串轉義序列
C#8.0
以後可以使用逐字轉義序列,進行轉義
格式: 在字串前加 @$
或者 $@
都可以
- 以
@
加在字串開頭時,字元換內的字元不會進行轉義 - 如果使用
@$
要在字串中包含{
或}
,需要使用{{
或}}
程式碼示例
複製程式碼- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
var xs = new int[] { 1, 2, 7, 9 };
var ys = new int[] { 7, 9, 12 };
Console.WriteLine($"Find the intersection of the {{{xs}}} and {{{string.Join(", ",ys)}}} sets.");
var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var verbatimInterpolated = $@"C:\Users\{userName}\Documents";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(verbatimInterpolated);
在內插字串中使用三元運算子
由於:
在內插表示式選項中有特殊含義(比如: 字元格式說明符前要使用),所以條件運算子需要放在括號內
- 1
- 2
- 3
- 4
- 5
var rand = new Random();
for (int i = 0; i < 7; i++)
{
Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5? "heads" : "tails")}");
}
複製程式碼
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Coin flip: heads
Coin flip: tails
Coin flip: heads
Coin flip: heads
Coin flip: tails
Coin flip: heads
Coin flip: tails
來源:https://www.cnblogs.com/xslx/p/15705784.html
格式字串
在使用write
或writeline
時可以有一個或以上的引數
- 如果不止一個引數,引數間使用逗號分隔
- 第一個引數必須是字串,稱為
格式字串
,輸出串中可以包含替代標記
- 替代標記在格式字串中標出位置,輸出中將用一個值進行替代
- 替代標記由
花括號{}
和一個整數
組成,其中整數是替換值的數字位置
,替換值的位置從0
開始編號
例子
複製程式碼- 1
- 2
- 3
- 4
string name = "hahaha";
int simple = 10;
Console.WriteLine("Hello, World! {0} | {1}", name, simple);
輸出
複製程式碼- 1
Hello, World! hahaha | 10
索引越界
複製程式碼- 1
- 2
- 3
- 4
string name = "hahaha";
int simple = 10;
Console.WriteLine("Hello, World! {0} | {2}", name, simple);
異常提示
複製程式碼- 1
Unhandled exception. System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
字串插值
C#6.0 引入了字串插值
它是通過直接替代字串中的替代標記
進行的,這種方式更加方便並且符合閱讀習慣
- 使用字串差值時 字串前必須新增
$
標記
例子
複製程式碼- 1
- 2
- 3
- 4
string name = "hahaha";
int simple = 10;
Console.WriteLine($"Hello, World! {name} | {simple}");
輸出
複製程式碼- 1
Hello, World! hahaha | 10
格式化字串
標準數字格式說明符
C#提供了很多方便的說明符對字元進行格式化
複製程式碼- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
string name = "hahaha";
int positiveInt= 110;
long bigInt = 123456789;
int decimalInt = -10;
double price = 12.5;
float pricef = -12.543553f;
double general = 4.123456789123456789;
double percentage = 0.123456789;
名稱 | 字元 | 意義 | 示例 |
---|---|---|---|
貨幣 | C,c | 使用貨幣符號把值格式化為貨幣,符號取決於程式所在的PC所在區域 格式 {C/c{精度說明符}( 小數位數 ) |
Console.WriteLine("{0:c4}", price); Console.WriteLine($"{price:C5}"); 輸出 ¥12.5000 ¥12.50000 |
十進位制數 | D,d | 十進位制字串,負數時有負號 格式 {D/d{精度說明符}( 補零位數 ) |
Console.WriteLine("十進位制數: {0:d8}", decimalInt); Console.WriteLine($"十進位制數: {decimalInt:D5}"); 輸出 -00000010 -00010 |
浮點數 | F,f | 浮點數,負數時有負號 格式 {F/f{精度說明符}( 小數位數 ) |
Console.WriteLine("浮點數 float: {0:f4}", pricef); Console.WriteLine($"浮點數 double: {price:f5}"); 輸出 -12.5433 12.50000 |
常規(未指定) | G,g | 未指定或指定為G/g時,會根據值型別轉換,浮點數時依然會四捨五入 格式 {G/g{精度說明符( 小數位數 )} |
Console.WriteLine("常規: {0:g5}", general); Console.WriteLine($"常規: {general:g}", general); 輸出 4.1235 4.123456789123456 |
十六進位制 | X,x | 轉換為十六進位制,字元大小寫會改變十六進位制字串的大小寫 精度如果大於長度會在前面補零,精度不夠會超過精度限制 格式 {X/x{精度說明符( 補零位數 )} |
Console.WriteLine("十六進位制: {0:X4}", decimalInt); Console.WriteLine($"十六進位制 {positiveInt:x6}"); 輸出 FFFFFFF6 00006e |
數字 | N,n | 轉換浮點數輸出,並且會在位數之間加入, 具體是, 還是空格 根據設定的區域而定格式 {X/x{精度說明符( 小數位數 )} |
Console.WriteLine("數字: {0:N}", general); Console.WriteLine($"數字: {bigInt:N5}"); 輸出 4.12 123,456,789.00000 |
百分比 | P,p | 轉換為百分比輸出,預設保留兩位 不足的地方會四捨五入 格式 {P/p{精度說明符( 小數位數 )} |
Console.WriteLine("百分比: {0:P}", percentage); Console.WriteLine($"百分比: {percentage:p4}"); 輸出 12.35% 12.3457% |
原始值 | R,r | 如果之後用Parse 轉換為數字,保證其和原始值相同格式 {R/r{精度說明符( 忽略,不起作用 )} |
Console.WriteLine("原始值: {0:R}", general); Console.WriteLine($"原始值: {general:r9}"); 輸出 4.123456789123456 4.123456789123456 |
科學計數法 | E,e | 轉換為科學計數法,大小寫和字元保持一致 精度不夠時四捨五入 格式 {R/r{精度說明符( 小數位數 )} |
Console.WriteLine("科學計數法: {0:E4}", general); Console.WriteLine($"科學計數法: {general:E6}"); 輸出 4.1235E+000 4.123457E+000 |
對齊說明符
對齊說明符表示欄位中字元的最小寬度
如果不進行對齊我們的程式碼會輸出這樣的結果
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
貨幣符號: ¥12.5000
貨幣符號: ¥12.50000
十進位制數: -00000010
十進位制數: -00010
浮點數 float: -12.5436
浮點數 double: 12.50000
常規: 4.1235
常規: 4.123456789123456
十六進位制: FFFFFFF6
十六進位制 00006e
十六進位制 6e
數字: 4.12
數字: 123,456,789.00000
百分比: 12.35%
百分比: 12.3457%
原始值: 4.123456789123456
原始值: 4.123456789123456
科學計數法: 4.1235E+000
科學計數法: 4.123457E+000
對於強迫症來說這肯定不能接受啊
來一段程式碼說明對齊說明符
複製程式碼- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Console.WriteLine("對齊說明符: |{0, 10}|", positiveInt);
Console.WriteLine("對齊說明符: |{0, -10}|", positiveInt);
Console.WriteLine($"對齊說明符: |{positiveInt, 10}|");
Console.WriteLine($"對齊說明符: |{positiveInt, -10}|");
Console.WriteLine("對齊說明符: |{0, 10:f11}|", percentage);
Console.WriteLine("對齊說明符: |{0, -10:f4}|", percentage);
輸出
複製程式碼- 1
- 2
- 3
- 4
- 5
- 6
對齊說明符: | 110|
對齊說明符: |110 |
對齊說明符: | 110|
對齊說明符: |110 |
對齊說明符: |0.12345678900|
對齊說明符: |0.1235 |
- 正數表示右對齊,負數表示左對齊
- 如果字元超出了限制的字元,則原限制失效
- 在對齊基礎上可以增加格式說明符 格式
{{變數}, {字元長度}:{格式說明符}}
內插字串轉義序列
C#8.0
以後可以使用逐字轉義序列,進行轉義
格式: 在字串前加 @$
或者 $@
都可以
- 以
@
加在字串開頭時,字元換內的字元不會進行轉義 - 如果使用
@$
要在字串中包含{
或}
,需要使用{{
或}}
程式碼示例
複製程式碼- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
var xs = new int[] { 1, 2, 7, 9 };
var ys = new int[] { 7, 9, 12 };
Console.WriteLine($"Find the intersection of the {{{xs}}} and {{{string.Join(", ",ys)}}} sets.");
var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var verbatimInterpolated = $@"C:\Users\{userName}\Documents";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(verbatimInterpolated);
在內插字串中使用三元運算子
由於:
在內插表示式選項中有特殊含義(比如: 字元格式說明符前要使用),所以條件運算子需要放在括號內
- 1
- 2
- 3
- 4
- 5
var rand = new Random();
for (int i = 0; i < 7; i++)
{
Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5? "heads" : "tails")}");
}
複製程式碼
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Coin flip: heads
Coin flip: tails
Coin flip: heads
Coin flip: heads
Coin flip: tails
Coin flip: heads
Coin flip: tails
來源:https://www.cnblogs.com/xslx/p/15705784.html