Выровнять валюту вправо в строковом формате - PullRequest
5 голосов
/ 15 сентября 2011

Я пытаюсь выровнять некоторую валюту вправо:

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

Где число выровнено поправо?

Ответы [ 4 ]

6 голосов
/ 15 сентября 2011

системе довольно сложно сказать, сколько мест занимают ваши номера.Таким образом, вы должны решить это самостоятельно.Если вы решили, что можете использовать что-то вроде String.PadLeft

Например

Console.WriteLine("kr. {0}", number1.ToString("#,##0.00").PadLeft(10,' '));
4 голосов
/ 15 сентября 2011
 string sym = CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol;
 Console.WriteLine("{0}{1,10:#,##0.00}",sym, number1);
 Console.WriteLine("{0}{1,10:#,##0.00}",sym, number2);

выход идеона

2 голосов
/ 10 июля 2015

Конечно, это не так хорошо, как принятый ответ, но у меня была та же проблема с выравниванием по правому краю, и мой немедленный рефлекс был:

//Output  kr. 150,45
Console.WriteLine("{0,10}",string.Format("{0:c2}",number1));
2 голосов
/ 15 сентября 2011

Это должно работать для любой культуры:

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) (!)
...