2013-03-04 12 views
1

Этот код: Console.Out.WriteLine(string.Format(CultureInfo.GetCultureInfo("hu-HU"), "{0:C}", 1234.56M)) произведет следующий результат: 1 234,56 Ft, что является технически корректным, но как это получается, чтобы угадать валюту?Почему в формате валюты .NET есть символ валюты?

Это поведение означает, что простое изменение культуры отображения от hu-HU до en-US умножит значение с более чем 200, в зависимости от текущих ставок. Вы бы никогда не допустили ошибку при выставлении счета 500 HUF в размере 500 долларов США. Очевидный.

только «хороший» способ установки валюты клонируется нужную культуру и устанавливая символ валюты:

var format = NumberFormatInfo.GetInstance(CultureInfo.GetCultureInfo("en-US")).Clone() as NumberFormatInfo; 
format.CurrencySymbol = "asd"; 
Console.Out.WriteLine(string.Format(format, "{0:C}", 1234.56M)); 

Это работает правильно производить asd1,234.56, но настолько громоздки.

Мои вопросы:

  1. Что такое отношение за недобросовестный к национальной валюте в этом глобальном мире мы жили в течение десятилетий?
  2. Почему нет способа указать сумму и валюту в более родственной форме, так как они так связаны?
  3. Бонус: если я использую sk-SK для культуры, я получаю евро за «дефолтную» валюту. Если я перейду на Framework 2.0, я должен получить Sk (для словацкой короны), так как в 2005 году это была национальная валюта. (Ну, это не произойдет, но я не пробовал его на любой системе, которая не имеет не позднее, чем 2,0..)

UPDATE: Выводы:

  1. Дефолт валюты от культуры это все нормально для некоторых, странно для других (включая меня)
  2. Нет типа денег, поскольку нет типов для длины, веса и т. д., где предел? Virtlink создал для этого библиотека: M42 Financial
+1

Он отображает его, потому что вы его попросили. Просто используйте другой спецификатор формата, если вы этого не хотите. Как «N2». –

+1

Вы вводите в заблуждение форматирование с данными. Если вы выставили счет за неправильный обменный курс или неправильную валюту, которая не является проблемой форматирования. – Paparazzi

+1

Хотя это один из «неконструктивных» вопросов в соответствии с правилами stackoverflow, это очень интересный вопрос. –

ответ

4

Я передумал: я согласен с вами, что странно, что валюта является частью культуры.

Это не является общим в .NET и Java, чтобы указать единицу со значением. Обычно вы не указываете температуру, расстояние или валюту с единицей. Для большинства целей устройство берется разработчиком: счетчики для расстояния и Цельсия для температуры. Для данной культуры нет единицы измерения расстояния или единицы температуры, указанной в .NET.

Чтобы быть последовательным, .NET Framework также не должна добавлять информацию о валюте в культуру. Большинство людей имеют дело с более чем одной валютой, и некоторые страны даже принимают несколько валют. Не каждый из данной культуры будет использовать одну и только одну валюту.

.NET framework содержит класс System.Currency, но он скрыт (внутренний) и используется только для метода Decimal.ToOACurrency(). Это тоже не очень полезно. Java содержит класс Currency с 2002 года, но поскольку .NET Framework была создана в 2000 году, и многие ошибки дизайна были скопированы с Java, это может быть один из них. Однако я не смог найти информацию о том, содержит ли класс Java Locale (или содержит) любую валютную информацию, и я не экстрасенс.

Ну, продолжая мысль о том, что единицы никогда не указаны в .NET, и не должно было быть валюты по умолчанию для культуры, тогда где они должны были бы поместить денежную единицу денежной ценности? Разумеется, они должны были создать класс Currency.


быстрый поиск не превратить любую денежную библиотеку, так что в качестве эксперимента, я создал портативную библиотеку для работы с деньгами (в том числе ее денежной единицы). Он работает на удивление хорошо.

Вы можете скачать его здесь:

M42 Financial - переносимая библиотека .NET для работы с деньгами и валютами.

Если у кого есть какие-либо предложения или улучшения, сделать запрос нагрузочного или создать проблемы.

+0

... которые являются действительными точками для форматирования чисел. Но как можно угадать валюту? –

+0

Ваши примеры различаются как по формату, так и по содержанию. Десять тысяч евро сильно отличаются от десяти тысяч долларов, в зависимости от того, какая культура отображается. Мне не хватает четкого различия между форматированием и контентом. Валюта - это контент, а не формат. (Расположение формата знака в валюте, хотя.) –

+0

@StefanSteinegger Символ валюты находится в классе информации культуры для указанной культуры. – Magnus

-4

Я не знаю .NET, но ваш форматировщик позволяет вам оставить «М» в строке формата?

Так что это: 1234.56 вместо этого 1234.56M

+0

Литеральный тип не влияет на форматирование. Я пробовал его с разными типами (M, D, даже L). –

+0

Это не символ формата. –

+0

'M' - это просто объявить десятичную константу вместо двойной. Я не думаю, что десятичные числа отформатированы по-разному. –

0

Я не могу сказать, о чем думали дизайнеры, но их решения здравый смысл для меня. Чтобы ответить на ваши вопросы:

  1. Большинство из нас и наших клиентов имеют дело с единой валютой, которая зависит от страны, в которой мы живем. Имеет смысл дефолт по умолчанию для этой культуры.
  2. Формат и формат номера валюты устанавливаются индивидуально, так как очень вероятно, что при изменении символов валют вы хотите сохранить формат номера по умолчанию. Например, если я (в США) печатал сумму в британских фунтах, я бы не хотел, чтобы формат номера менялся - просто символ валюты. Если бы мне пришлось установить их оба, мне нужно было бы знать не только новый символ валюты, но и конкретный формат чисел, который я использую. Кроме того, если они были объединены, то изменение формата номера (для невоенных значений) также потребует от меня указать символ валюты. Если у вас не было двух совершенно разных форматов чисел ... это было бы просто сумасшествием.
  3. Нет ответа на эту конкретную проблему.

Короче говоря, наличие двух отдельных настроек дает вам большую гибкость и упрощает процесс. Сочетание вещей сделало бы больше работы, чтобы изменить вещи индивидуально.

+0

С помощью встроенного обмена валюты нет хорошего способа для приложения в США продемонстрировать британские фунты. Мне нужно либо показать их в формате США знаком $, использовать метод clone() из вопроса, либо реализовать собственное форматирование денег. – thelem

2

Я просто думаю, что это не предназначено для использования, когда в приложении могут появляться несколько валют. Это может быть полезно, когда у вас есть простое приложение, которое обрабатывает деньги так же, как цифры, которые нужно интерпретировать в местной валюте.

Во всех других случаях не используйте его.

Я не думаю, что таких приложений много, где это имеет смысл.

0

Почему в формате валюты .NET есть символ валюты?

Потому что это валютный формат.

+0

Итак, вы имеете в виду, что неважно, пять или пять евро, это просто проблема с презентацией. –

+0

Действительно, вы ожидаете, что отдельные валюты будут типами данных, которые вы не можете добавить в доллары евро. Как насчет фунта и килограмма? Как насчет 1/1/2008 и 2008-1-1 - те же даты? Где останавливается - должен ли SQL иметь типы данных для евро и долларов? – Paparazzi

+0

Вы правы с этим. Как указывалось выше, @Virtlink указывает, что размеры или объединения редко инкапсулируются суммами. –

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