自訂數值格式字串
您所建立且由一或多個自訂數值格式規範所組成的自訂數值格式字串會定義如何格式化數值資料,自訂數值格式字串相當於定義為不是標準數值格式字串的任何字串。
下表說明自訂數值的格式規範。如需每種格式規範所產生之輸出的範例,請參閱自訂數值格式字串輸出範例。如需詳細資訊,請參閱表格之後的注意事項。
格式規範 | 名稱 | 描述 |
---|---|---|
0 |
零值預留位置 |
如果正在格式化的值有數字位於格式字串中出現 '0' 的位置上,那麼那個數字會複製到輸出字串。小數點前最左邊 '0' 和小數點後最右邊 '0' 的位置決定要一直在輸出字串中出現的位數範圍。 "00" 規範會造成數值捨入至最接近的小數點前面數值,而其中永遠使用遠離零的捨入方式。例如,使用 "00" 格式化 34.5 將會得到值 35。 |
# |
數字預留位置 |
如果正在格式化的值有數字位於格式字串中出現 '#' 的位置上,那麼那個數字會複製到輸出字串。否則,沒有東西會存放在結果字串中的那個位置。 注意,如果它不是有效位數的話,這個規範不會顯示 '0' 字元,即使 '0' 是字串中的唯一數字也一樣。如果是正在顯示的數值的有效位數,會顯示 '0' 字元。 "##" 格式字串會造成數值捨入至最接近的小數點前面數值,而其中永遠使用遠離零的捨入方式。例如,使用 "##" 格式化 34.5 將會得到值 35。 |
. |
小數點 |
格式字串中第一個 '.' 字元決定格式化的值中小數分隔符號的位置;任何額外 '.' 字元將被忽略。 當做小數分隔符號的實際字元由控制格式的 NumberFormatInfo 的 NumberDecimalSeparator 屬性來決定。 |
, |
千位分隔符號和數值縮放 |
',' 字元可當做千位分隔符號規範和數值縮放規範使用。 千位分隔符號規範:如果在兩個採用數字之整數格式的數字替代符號 (Placeholder) (0 或 #) 之間指定一或多個 ',' 字元,則會在每個數字群組輸出的整數部分之間插入群組分隔符號字元。 目前 NumberFormatInfo 物件的 NumberGroupSeparator 和 NumberGroupSizes 屬性會判斷當做數字群組分隔符號使用的字元,以及每個數字群組的大小。例如,如果使用字串 "#,#" 和不變的文化特性來格式化數字 1000,則輸出為 "1,000"。 數值縮放規範:如果在緊接著明確或隱含小數點的左側指定了一或多個 ',' 字元,則每次發生數值縮放規範時,要進行格式化的數字會除以 1000。例如,如果使用字串 "0,," 來格式化數字 1 億,則其輸出為 "100"。 您可以在相同的格式字串內使用千位分隔符號和數值縮放規範。例如,如果使用字串 "#,0,," 和不變的文化特性來格式化數字 10 億,則輸出為 "1,000"。 |
% |
百分比預留位置 |
格式字串中 '%' 字元的出現會使數值在格式化之前被乘以 100。適當符號會在格式字串中 '%' 出現的位置上插入數值本身。使用的百分比字元取決於目前的 NumberFormatInfo 類別。 |
E0 E+0 E-0 e0 e+0 e-0 |
科學標記法 |
如果字串 'E'、'E+'、'E-'、'e'、'e+' 或 'e-' 的任何一個出現在格式字串中,並有至少一個 '0' 字元緊接其後,那麼數值將使用科學標記法,以 'E' 或 'e' 插入數字和指數之間來格式化。接在科學標記法指標之後的 '0' 字元數目將決定要輸出的指數的最少位數。'E+' 和 'e+' 格式指示正負號字元 (正號或負號) 應該一直在指數前面。"E"、"E-"、"e" 或 "e-" 格式指示正負號字元應該只能放在負數指數前面。 |
\ |
逸出字元 |
在 C# 和 C++ 中,反斜線字元會造成格式字串中的下一個字元被解譯為逸出序列 (Escape Sequence)。它使用於傳統格式化序列,例如 "\n" (新行)。 某些語言中,逸出字元本身當做常值 (Literal) 時,必須在前面加上逸出字元。否則,編譯器會解譯字元為逸出序列。使用字串 "\\" 來顯示 '\'。 注意,這個逸出字元在 Visual Basic 中不支援;然而,ControlChars 提供相同功能。 |
'ABC' "ABC" |
常值字串 |
含括在單引號或雙引號中的字元會複製到結果字串,並且不影響格式。 |
; |
區段分隔符號 |
';' 字元被用來在格式字串中為正數、負數和零值分隔區段。 |
其他 |
所有其他字元 |
其他任何字元都會複製到結果字串,並且不影響格式。 |
注意
無限浮點數和 NaN
請注意,不管格式字串為何,如果 Single 或 Double 浮點型別為正無限大、負無限大或不是數字 (NaN),則格式化後的字串分別會是由目前適用之 NumberFormatInfo 物件所指定的 PositiveInfinitySymbol、NegativeInfinitySymbol 或 NaNSymbol 屬性。
控制台設定值
[控制台] 中 [地區及語言選項] 項目的設定會影響格式化作業所產生的結果字串。這些設定是用來初始化與目前執行緒文化特性相關聯的 NumberFormatInfo 物件,而且目前的執行緒文化特性會提供用來管理格式的值。使用不同設定的電腦將會產生不同的結果字串。
四捨五入和定點格式字串
請注意,如果是定點格式字串 (即不含科學標記法格式字元的格式字串),則數值會四捨五入成與小數點右邊之數字替代符號一樣多的小數位數。如果格式字串不包含小數點,數值四捨五入至最接近的整數。如果數值有比小數點左邊的數字預留位置還要多的位數,額外位數會緊接第一個數字預留位置之前複製到輸出字串。
區段分隔符號和格式化的條件
各種格式可以根據值是否為正數、負數或零來套用於字串。若要產生這個行為,自訂格式字串可以包含多達三個以分號分隔的區段,下表將說明這些區段。
區段數 | 描述 |
---|---|
一個區段 |
此格式字串適用於所有的值。 |
兩個區段 |
第一個區段適用於正數值及零值,第二個區段適用於負數值。 如果要格式化的數值為負數,但依照第二區段的格式四捨五入之後成為零,那麼產生的零會依照第一區段來格式化。 |
三個區段 |
第一個區段適用於正數值,第二個區段適用於負數值,而第三個區段則適用於零值。 第二個區段可留白 (分號之間沒有任何內容),此時第一個區段將套用到所有非零值。 如果要格式化的數值為非零值,但依照第一或第二區段的格式四捨五入之後成為零,那麼產生的零會依照第三區段來格式化。 |
區段分隔符號會在最終值已格式化時,忽略任何事先存在而與數值相關的格式。例如,負數值在使用區段分隔符號時永遠不以負號來顯示。如果您想要最終的格式化值具有負號,您應該明確包含負號做為自訂 格式規範的一部分。
下列程式碼片段將說明如何使用區段分隔符號來產生格式化的字串。
Dim MyPos As Double = 19.95
Dim MyNeg As Double = -19.95
Dim MyZero As Double = 0
' In the U.S. English culture, MyString has the value: $19.95.
Dim MyString As String = MyPos.ToString("$#,##0.00;($#,##0.00);Zero")
' In the U.S. English culture, MyString has the value: ($19.95).
' The minus sign is omitted by default.
MyString = MyNeg.ToString("$#,##0.00;($#,##0.00);Zero")
' In the U.S. English culture, MyString has the value: Zero.
MyString = MyZero.ToString("$#,##0.00;($#,##0.00);Zero")
double MyPos = 19.95, MyNeg = -19.95, MyZero = 0.0;
// In the U.S. English culture, MyString has the value: $19.95.
string MyString = MyPos.ToString("$#,##0.00;($#,##0.00);Zero");
// In the U.S. English culture, MyString has the value: ($19.95).
// The minus sign is omitted by default.
MyString = MyNeg.ToString("$#,##0.00;($#,##0.00);Zero");
// In the U.S. English culture, MyString has the value: Zero.
MyString = MyZero.ToString("$#,##0.00;($#,##0.00);Zero");
兩個自訂格式範例
下列程式碼片段將示範自訂數值的格式化。在這兩個範例中,自訂格式字串內的數字替代符號 (#
) 會顯示數值資料,並將所有其他的字元複製到輸出中。
Dim myDouble As Double = 1234567890
Dim myString As String = myDouble.ToString( "(###) ### - ####" )
' The value of myString is "(123) 456 – 7890".
Dim MyInt As Integer = 42
MyString = MyInt.ToString( "My Number = #" )
' In the U.S. English culture, MyString has the value:
' "My Number = 42".
Double myDouble = 1234567890;
String myString = myDouble.ToString( "(###) ### - ####" );
// The value of myString is "(123) 456 – 7890".
int MyInt = 42;
MyString = MyInt.ToString( "My Number = #" );
// In the U.S. English culture, MyString has the value:
// "My Number = 42".