2010-01-13 29 views
2

我有一種情況,我需要格式化一個整數,取決於它是否爲零。使用自定義數字格式字符串,可以用分號作爲分隔符來實現。考慮以下內容:結合自定義數字格式字符串與十六進制格式字符串

// this works fine but the output is decimal 
string format = "{0:0000;-0000;''}"; 
Console.WriteLine(format, 10); // outputs "0010" 
Console.WriteLine(format, -10); // outputs "-0010" 
Console.WriteLine(format, 0); // outputs "" 

但是,我想要使用的格式是十六進制。我想輸出是更像是:

// this doesn't work 
string format = "{0:'0x'X8;'0x'X8;''}"; 
Console.WriteLine(format, 10); // desired "0x0000000A", actual "0xX8" 
Console.WriteLine(format, -10); // desired "0xFFFFFFF6", actual "0xX8" 
Console.WriteLine(format, 0); // desired "", actual "" 

不幸的是,使用自定義數字格式字符串時,我不知道如何(如果它甚至有可能)使用數字的十六進制表示的自定義格式字符串我的情況不允許太大的靈活性,所以做兩通格式不是一種選擇。無論我做什麼都需要表示爲String.Format樣式格式字符串。

編輯
看在單源的NumberFormatter後(.NET實現僅僅推遲到內部非託管代碼)我已經證實了我的懷疑。十六進制格式字符串被視爲一種特殊情況,它只能用作標準格式字符串,不能用於自定義格式字符串。由於三部分格式字符串不能與標準格式字符串一起使用,所以我幾乎是S.O.L.

我可能會咬緊牙關,使整數屬性是一個可爲空的int,並使用零點我在使用零漂白。

+0

當您嘗試十六進制格式時會發生什麼? – Lazarus 2010-01-13 16:39:18

+0

我用第二種格式的實際輸出更新了問題。但基本上,它將X8(它是一個有效的獨立格式字符串)視爲文字。 – Josh 2010-01-13 16:47:20

回答

2

如下格式的字符串幾乎是正確的:

string format = "0x{0:X8}"; 
Console.WriteLine(format, 10); 
Console.WriteLine(format, -10); 
Console.WriteLine(format, 0); 

給出:

0X0000000A

0xFFFFFFF6

我仍然努力工作''爲0.

編輯:我有同樣的問題,只有當格式字符串有分隔符'X8'成爲文字';'正在使用。我只是想在.NET源代碼中探索一下,看看我能看到什麼。

編輯2:遵循擴展方法將返回正確格式的字符串,既用於+'ves,-'ves和0.參數長度是十六進制字符串中所需的字符數量(不包括'0x ' 在前面)。

public static string ToHexString(this int source, int length) 
    { 
     return (source != 0) ? string.Format("0x{0:X" + length.ToString() + "}",source) : string.Empty; 
    } 
+0

感謝您的關注。我一直在試圖做同樣的事情,但我認爲不幸的現實是,十六進制的標準格式字符串是一種特殊情況,不能使用自定義格式字符串進行復制。 – Josh 2010-01-13 17:39:04

+0

看起來是這樣的。我用一個小擴展方法更新了答案,它將根據給定的規則格式化int。 – 2010-01-13 18:05:10

+0

謝謝,但字符串數字的格式不在我的手中,所以我不能使用擴展方法或IValueConverter等。我所能做的就是提供字符串格式來格式化輸出。使用3部分的自定義格式字符串,我可以使零顯示爲空字符串,但不幸的是,它看起來像我堅持十進制顯示非零值。 – Josh 2010-01-13 18:38:39

相關問題