右对齐货币字符串格式

问题描述:

我试图对准一些货币权:右对齐货币字符串格式

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

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

系统很难说出你的号码有多少个地方。所以你必须自己决定。如果你已经决定,你可以使用类似String.PadLeft

例如

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

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

+0

对不起 - 感谢提示(猜我必须合并它们;)) – Carsten

这应该对任何文化工作:

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

当然这不是与已接受的答案一样好,但我有与右对齐相同的问题我的直接反应是:

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