2014-02-17 5 views
3

Я унаследовал некоторый код, где цены отформатированный как это:Есть ли разница между результатом этих двух строк формата?

(1.23d).ToString("£0.00"); 

я обычно форматировать валюту, как это:

(1.23d).ToString("C"); 

Если локаль машины установлен в Великобритании (которая), то есть ли разница между этими двумя подходами? Могу ли я просто сделать большую находку и заменить ее?

+7

Я задавался вопросом, будет ли это иметь значение для отрицательных значений, но это не похоже на. Я надеюсь, что вы исправляете приложение, чтобы использовать 'decimal' вместо' double' для числовых значений, в то же время ... –

+1

@JonSkeet Это делает разницу в контексте группировки цифр. – BartoszKP

+0

@BartoszKP: Ах, верно - я не пробовал ни одного номера выше 1000. –

ответ

1

Вы можете частично проверить, что при выполнении этого кода на машине с этой локали (или путем применения его первым с Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");):

var nf = CultureInfo.CurrentCulture.NumberFormat; 
Console.WriteLine("CurrencyPositivePattern: " + nf.CurrencyPositivePattern); 
Console.WriteLine("CurrencyNegativePattern: " + nf.CurrencyNegativePattern); 
Console.WriteLine("NegativeSign: " + nf.NegativeSign); 
Console.WriteLine("CurrencySymbol: " + nf.CurrencySymbol); 
Console.WriteLine("CurrencyDecimalDigits: " + nf.CurrencyDecimalDigits); 
Console.WriteLine("CurrencyDecimalSeparator: " + nf.CurrencyDecimalSeparator); 
Console.WriteLine("CurrencyGroupSeparator: " + nf.CurrencyGroupSeparator); 
Console.WriteLine("CurrencyGroupSizes: " + string.Join(",", nf.CurrencyGroupSizes.Select(gs => gs.ToString()))); 

Обратите внимание на свойство размеров групп. На моей машине этот код:

Console.WriteLine((1232323d).ToString("C")); 
Console.WriteLine((1232323d).ToString("£0.00")); 

производит две разные строки из-за групп цифр.

Кроме того, как уже отмечали другие, и, как вы уже знаете, все равно - decimal следует использовать вместо double для валюты.

0

Это не будет никакой разницей. Если в настройках вашего регионального языка выбрана желаемая валюта.

И да, всегда предпочитаю decimal как тип данных за деньги.

2

Согласно стандарту Numeric Format Strings, поведение спецификатора формата «C» определяется настройками в текущей культуре NumberFormatInfo. Вы можете проверить, чтобы убедиться, изучив NumberFormatInfo:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); 
var nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; 
Console.WriteLine(nfi.CurrencyDecimalDigits); 
Console.WriteLine(nfi.CurrencyDecimalSeparator); 
Console.WriteLine(nfi.CurrencyNegativePattern); 
Console.WriteLine(nfi.CurrencyPositivePattern); 
Console.WriteLine(nfi.CurrencySymbol); 
+0

Вы не указали размеры групп валют, которые здесь важны. – BartoszKP

+0

@BartoszKP: Надзор. Вы можете добавить его. –

+0

Я сделал это уже;) – BartoszKP

0

(1.23d).ToString("£0.00"); может сделать более ясным то, что числа всегда представляют собой (бизнес-логику) и что это не просто произвольная вещь дисплея.

Смежные вопросы