2011-09-14 101 views
3

我試圖對準一些貨幣權:右對齊貨幣字符串格式

double number1 = 150.45; 
double number2 = 1400.95; 

//Output kr. 150,45 
Console.WriteLine("{0:c2}", number1); 

//Output kr. 1.400,95 
Console.WriteLine("{0:c2}", number2); 

但我想我的輸出看起來像這樣。

//Output kr. 150.45 

//Output kr. 1.400,95 

其中數字與右邊對齊?

+0

感謝您的信息,在我真正的項目中我使用小數。只是我爲這個問題創建的一些快速代碼。 – gulbaek

回答

4
string sym = CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol; 
Console.WriteLine("{0}{1,10:#,##0.00}",sym, number1); 
Console.WriteLine("{0}{1,10:#,##0.00}",sym, number2); 

ideone output

+0

如果文化在貨幣符號後面加上貨幣符號怎麼辦? – dtb

+1

@dtb你可以看看['NumberFormatInfo.CurrencyPositivePattern'](http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencypositivepattern.aspx)並重新格式化它我猜。 –

+0

如果文化格式化的貨幣值不是小數點後兩位,或者將數千個貨幣值分成3組? – dtb

5

系統很難說出你的號碼有多少個地方。所以你必須自己決定。如果你已經決定,你可以使用類似String.PadLeft

例如

Console.WriteLine("kr. {0}", number1.ToString("#,##0.00").PadLeft(10,' ')); 
+0

你的第一個建議是缺少thousandsseparator,而你的第二個建議不起作用。見http://ideone.com/NQuHs – gulbaek

+0

對不起 - 感謝提示(猜我必須合併它們;)) – Carsten

2

這應該對任何文化工作:

int width = 20; 

string result = 1400.95.ToString("C"); 

NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; 
if (nfi.CurrencyPositivePattern % 2 == 0) 
{ 
    result = nfi.CurrencySymbol + 
      result.Substring(nfi.CurrencySymbol.Length).PadLeft(width); 
} 
else 
{ 
    result = result.PadLeft(width + nfi.CurrencySymbol.Length); 
} 

// result == "$   1,400.95" (en-US) 
//   "£   1,400.95" (en-GB) 
//   "   1.400,95 €" (de-DE) 
//   "   1.400,95 kr" (sv-SE) 
//   "    1.401 kr." (is-IS) 
//   "kr   1 400,95" (nb-NO) 
//   "kr.   1.400,95" (da-DK) (!) 
+0

這是一個相對簡單的任務的代碼很多:-D但謝謝你的努力。 – gulbaek

+0

如果你認爲在這個星球上使用了很多很多種語言,並不是每個人都樂於使用丹麥語輸出,那麼這不是很多代碼。 :-) – dtb

+0

那麼至少現在我們有通用的解決方案,Thx ;-D – gulbaek

2

當然這不是與已接受的答案一樣好,但我有與右對齊相同的問題我的直接反應是:

//Output kr. 150,45 
Console.WriteLine("{0,10}",string.Format("{0:c2}",number1));