練習 - 調查字串格式設定基礎

已完成

在此單元中,您將學習設定字串格式以進行有效顯示的方法,尤其是針對使用多個變數的案例。

準備您的撰寫程式碼環境

本課程模組包含實際操作活動,可引導您完成建置及執行示範程式碼的程序。 鼓勵您使用 Visual Studio Code 做為開發環境來完成這些活動。 針對這些活動使用 Visual Studio Code,可協助您更熟悉在全球專業人員使用的開發人員環境中撰寫及執行程式碼。

注意

如果您已完成此 C# 系列中的其他 Microsoft Learn 課程模組,您可能已建立程式碼範例的專案資料夾。 如果是這種情況,您可以略過下列步驟的部分,並刪除用於上一個練習的 Project.cs 檔案中的程式碼。

  1. 打開 Visual Studio Code。 您可以使用 Windows [開始] 功能表 (或另一個作業系統的對等資源) 來開啟 Visual Studio Code。

  2. 在 Visual Studio Code 的 [檔案] 功能表上,選取 [開啟資料夾]。

  3. 在 [開啟資料夾] 對話方塊中,瀏覽至 Windows Desktop 資料夾。 如果您在不同的資料夾位置中保留程式碼專案,您可以改用該資料夾位置。 針對本訓練,請務必使用容易找到並記住的位置。

  4. 在 [開啟資料夾] 對話方塊中,選取 [選取資料夾]。 如果您看到詢問您是否信任作者的安全性對話方塊,請選取 [是]。

  5. 在 Visual Studio Code 的 [終端] 功能表上,選取 [新增終端]。 請注意,終端面板中的命令提示字元會顯示目前資料夾的資料夾路徑。 例如:

    C:\Users\someuser\Desktop>
    
  6. 在終端命令提示字元中,若要在指定的資料夾中建立新的主控台應用程式,請輸入 dotnet new console -o ./CsharpProjects/TestProject,然後按 Enter 鍵。 這個 .NET CLI 命令會使用 .NET 程式範本,在指定的資料夾位置中建立新的 C# 主控台應用程式專案。 這個命令會為您建立 CsharpProjects 和 TestProject 資料夾,並使用 TestProject 做為 .csproj 檔案的名稱。

  7. 在 [總管] 面板中,展開 CsharpProjects 資料夾。 您應該會看到 TestProject 資料夾和兩個檔案:名為 Program.cs 的 C# 應用程式檔案,以及名為 TestProject.csproj 的 C# 專案檔。

  8. 在 [總管] 面板中,若要在 [編輯器] 面板中檢視程式碼檔案,請選取 [Program.cs]。

  9. 刪除現有的程式碼。 您會使用此 C# 主控台專案,在此課程模組期間建立、建置及執行程式碼範例。

  10. 關閉 [終端] 面板。

什麼是複合格式設定?

「複合格式設定」在字串內使用編號的預留位置。 在執行階段,大括弧內的所有項目都會解析為一個也會根據其位置傳遞的值。

這個複合格式設定範例會在 string 資料類型關鍵字上使用內建方法 Format()。 在 Visual Studio Code 編輯器更新您的程式碼,如下所示:

string first = "Hello";
string second = "World";
string result = string.Format("{0} {1}!", first, second);
Console.WriteLine(result);

若執行此程式碼,您會看到下列輸出。

Hello World!

關於此程式碼,有一些重要事項要注意。

  • 給定資料類型的資料類型與變數具有內建的「協助程式方法」,可讓特定工作變得更容易。
  • 常值字串 "{0} {1}!" 構成範本,其中的一部分將會在執行階段被取代。
  • 語彙基元 {0} 會在字串由其他單字進行範本取代後由第一個引數 (變數 first 的值) 取代。
  • 語彙基元 {1} 會在字串範本後 (在其他單字中) 的第二個引數 (變數 second 的值) 取代。

注意

您可能會認為從數字 0 開始有點奇怪。 實際上,這在軟體開發中十分常見。 當有可使用數字識別的項目序列時,編號通常從 0 開始。

  1. 更新程式碼,如下所示:

    string first = "Hello";
    string second = "World";
    Console.WriteLine("{1} {0}!", first, second);
    Console.WriteLine("{0} {0} {0}!", first, second);
    
  2. 儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。 您應該會看見下列輸出:

    World Hello!
    Hello Hello Hello!
    

有關這些範例的一些觀察:

  • 針對第一個 Console.WriteLine() 陳述式,您會看到語彙基元能以任何順序排列。 範例程式碼在 {0} 前面有 {1}
  • 針對第二個 Console.WriteLine() 陳述式,您會看到語彙基元能搭配 {0} 的三個執行個體重複使用。 此外,不會使用第二個變數引數 second。 不過,程式碼仍會執行,而不會發生錯誤。

什麼是字串插補?

「字串插補」是可簡化複合格式設定的技術。

您可以直接使用大括弧內的變數名稱,而不需要使用編號的語彙基元並將常值或變數名稱包含在 String.Format()Console.WriteLine() 的引數清單中。

  1. 若要為字串進行插補,您必須在它前面加上 $ 指示詞。 現在,建立先前使用字串插補 (而非複合格式設定) 的相同範例。 更新程式碼,如下所示:

    string first = "Hello";
    string second = "World";
    Console.WriteLine($"{first} {second}!");
    Console.WriteLine($"{second} {first}!");
    Console.WriteLine($"{first} {first} {first}!");
    
  2. 儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。 您應該會看見下列輸出:

    Hello World!
    World Hello!
    Hello Hello Hello!
    

注意

若您查看書籍與線上的程式碼範例,您可能會看到同時使用了「複合格式設定」與「字串插補」,但通常您應該優先選擇「字串插補」

設定貨幣格式

複合格式設定與字串插補可用來設定在給定的特定語言與文化特性下要顯示的值格式。 在下列範例中,:C 貨幣格式規範是用來將 pricediscount 變數呈現為貨幣。 更新程式碼,如下所示:

decimal price = 123.45m;
int discount = 50;
Console.WriteLine($"Price: {price:C} (Save {discount:C})");

若您在 Windows 顯示語言設定為「英文 (美國)」的電腦上執行此程式碼,則會看到下列輸出。

Price: $123.45 (Save $50.00)

請注意,將 :C 新增至大括弧內的語彙基元,會將數字格式設定為貨幣,不論您是使用 intdecimal

注意

若您的國家/地區與語言未知,會發生什麼情況? 若您在瀏覽器內 .NET 編輯器 (例如在 TrydotNet) 中執行先前的程式碼,您會看到下列輸出: Price: ¤123.45 (Save ¤50.00) 。 使用了符號 ¤,而非您國家/地區的貨幣符號。 這是用於表示「貨幣」(不論貨幣「類型」 為何) 的泛用符號。 您會在 .NET 編輯器中看到此符號,因為它會忽略您目前的位置。

使用者的國家/地區與語言對字串格式設定有什麼影響

如果您在位於法國且 Windows 顯示語言設定為法文的電腦上執行先前的程式碼,會發生什麼事? 在此情況下,您會看到下列輸出。

Price: 123,45 € (Save 50,00 €)

先前的 "€" 輸出的原因是字串貨幣格式設定功能相依於「文化特性」的本機電腦設定。 在此內容中,「文化特性」一詞指的是終端使用者的國家/地區與語言。 「文化特性代碼」是電腦用來識別終端使用者位置與語言的五個字元字串。 文化特性代碼可以確保特定資訊 (如日期與貨幣) 能正確顯示。

例如:

  • 位於美國之英文講者的文化特性代碼為 en-US
  • 位於法國之法文講者的文化特性代碼為 fr-FR
  • 位於加拿大之法文講者的文化特性代碼為 fr-CA

文化特性會影響書寫系統、使用的行事曆、字串的排序次序,以及日期與數字的格式 (例如設定貨幣格式)。

不幸的是,確保您的代碼在所有電腦上都能正常運作 (不論國家/地區或終端使用者的語言為何) 非常有挑戰性。 此流程稱為「當地語系化」(或「全球化」)。 當地語系化取決於此課程模組中未討論的許多因素,但只要根據使用者的文化特性,字串格式設定語法就能使用不同的格式。

設定數字格式

處理數值資料時,您可能會想要透過包含逗號來描述千、百萬、十億等等,針對可讀性設定數字的格式。

N 數值格式指定子可讓數字更容易閱讀。 更新程式碼,如下所示:

decimal measurement = 123456.78912m;
Console.WriteLine($"Measurement: {measurement:N} units");

若您從 en-US 文化特性檢視此項目,則會看到下列輸出。

Measurement: 123,456.79 units

N 數值格式規範預設只會顯示小數點後兩位。

如果您想要顯示更高的精確度,您可以在指定子後面加上數字。 下列程式碼會使用 N4 指定子,在小數點後顯示四位數。 更新程式碼,如下所示:

decimal measurement = 123456.78912m;
Console.WriteLine($"Measurement: {measurement:N4} units");

若您從 en-US 文化特性檢視此項目,則會看到下列輸出。

Measurement: 123,456.7891 units

設定百分比格式

使用 P 格式指定子來設定百分比格式。 之後加上數字,以控制小數點之後顯示的值數目。 更新程式碼,如下所示:

decimal tax = .36785m;
Console.WriteLine($"Tax rate: {tax:P2}");

若您從 en-US 文化特性檢視此項目,則會看到下列輸出。

Tax rate: 36.79 %

結合格式設定方法

字串變數可以儲存使用格式設定技術建立的字串。 在下列範例中,會設定十進位和十進位數學結果的格式,並使用複合格式設定儲存在 yourDiscount 字串中。

更新程式碼,如下所示。

decimal price = 67.55m;
decimal salePrice = 59.99m;

string yourDiscount = String.Format("You saved {0:C2} off the regular {1:C2} price. ", (price - salePrice), price);

Console.WriteLine(yourDiscount);

若您從 en-US 文化特性檢視此項目,則會看到下列輸出。

You saved $7.56 off the regular $67.55 price. 

您可以合併多個已設定格式的字串。 建置在先前的程式碼上,使用字串插補串連計算的百分比,而不是在透過將 yourDiscount += $"A discount of {(price - salePrice)/price:P2}!"; 插入到 Console.WriteLine() 前的行中的程式碼中以使用字串串連。

注意

您不需要搭配此字串插補方法使用 String.Format()

更新程式碼,如下所示。

decimal price = 67.55m;
decimal salePrice = 59.99m;

string yourDiscount = String.Format("You saved {0:C2} off the regular {1:C2} price. ", (price - salePrice), price);

yourDiscount += $"A discount of {((price - salePrice)/price):P2}!"; //inserted
Console.WriteLine(yourDiscount);

若您從 en-US 文化特性檢視此單位,則會看到下列輸出。

You saved $7.56 off the regular $67.55 price. A discount of 11.19%!

概括回顧

以下是此單元中有關字串格式設定的重點:

  • 您可以使用複合格式設定或字串插補來設定字串格式。
  • 使用複合格式設定,您可以使用包含一或多個形式為 {0} 之取代語彙基元的字串範本。 您也會提供符合取代語彙基元的引數清單 (以其順序為基礎)。 使用 string.Format()Console.WriteLine() 時,可以使用複合格式設定。
  • 使用字串插補,您可以使用包含您想要取代之變數名稱 (以大括弧括住) 的字串範本。 在字串範本前面使用 $ 指示詞,表示您想要為字串進行插補。
  • 使用 :C 指定子來設定貨幣格式。
  • 使用 :N 指定子來設定數字格式。 在 {myNumber:N3} 之類的 :N 後面使用數字來控制精確度 (小數點後的值數目)。
  • 使用 :P 格式指定子來設定百分比格式。
  • 貨幣與數字的格式設定取決於終端使用者的文化特性,這是五個字元的代碼,包含使用者的國家/地區與語言 (根據其電腦上的設定而定)。

檢定您的知識

1.

哪一個是 Console.WriteLine($"Tax rate: {tax:P1}"); 的輸出,其中 tax 是由 decimal tax =.12051 m; 定義?