Я использую метод .ToString("C")
для отображения десятичного числа в формате валюты. Но результат выглядит LKE "US $ 5,365.20" вместо "$ 5,365.20". Я попытался использовать .ToString("C", new CultureInfo("en-US"))
, результаты же. Но когда я попытался использовать другую культуру (например, en-GB), тогда все было в порядке (£ 1,234,56).
Итак, почему «US» появился перед символом «$»? И как я могу его удалить?
UPD Извините. Просто проверил его снова, и я вижу, что с new CultureInfo("en-US"))
все работает отлично, я смотрел на другой ярлык :) Но теперь я вижу (спасибо @Mike McCaughan), что текущий символ валюты «US $». Название текущей культуры - «en-US».
ответ
появляется «США» перед «$», потому что кто-то настроило символ валюты с помощью Region апплета панели управления. Для того, чтобы получить символ валюты по умолчанию, используйте CultureInfo.GetCultureInfo
вместо constructor:
decimal amount = 5365.20M;
Console.WriteLine(amount.ToString("C")); // US$5,365.20
Console.WriteLine(amount.ToString("C", new CultureInfo("en-US"))); // US$5,365.20
Console.WriteLine(amount.ToString("C", CultureInfo.GetCultureInfo("en-US"))); // $5,365.20
В документации MSDN Library объясняет разницу. Для конструктора:
Пользователь может выбрать переопределение некоторых значений, связанных с текущей культурой Windows, с помощью раздела региональных и языковых параметров панели управления. ... Если идентификатор культуры, связанный с именем соответствует идентификатору культуры текущей культуры Windows, этот конструктор создает объект CultureInfo, который использует эти переопределения ...
И GetCultureInfo:
Если имя - это имя текущей культуры, возвращаемый объект CultureInfo не отражает каких-либо переопределений пользователей. Это делает метод подходящим для серверных приложений или инструментов, которые не имеют реальной учетной записи пользователя в системе и которые должны эффективно загружать несколько культур.
UPDATE: Если .ToString("C", new CultureInfo("en-US"))
работает, но .ToString("C")
не произойдет, то проблема может быть, что какой-либо другой код, присваиваемый ваш поток пользовательских CultureInfo с «US $», как символ валюты.
Дело в том, что 'new CultureInfo (« en-US »)' работает для меня, как я вижу, проверьте мой UPD. Тогда странно, по вашему мнению, это не должно работать. Но я думаю, что переопределение может быть причиной, во всяком случае. –
Вы уверены, что на другой метке в вашем UPD используется '.ToString (« C », новая CultureInfo (« en-US »))?? Также обратите внимание, что этот код будет применять пользовательские переопределения только в том случае, если регион Windows на самом деле «английский (США)». –
Да, я уверен. О настройках Windows. В любом случае я использовал дату, валюту и другие настройки для своего локального региона (я уже проверял его с настройками в США, то же самое). Настройки культуры, установленные DotNetNuke CMS, которые являются основой для этого веб-приложения. Так что теперь я думаю, что проблема есть. –
Тестирование, которое предоставил Mike McCaughan
, я думаю, что он удалит US
, но он также добавит $$
в существующую валюту. Я испытал это, и это будет работать, но я думаю, что есть некоторые лучшие способы сделать это, но это даст следующие
Удалить US
первоначально будет решить эту проблему в одной линии ..
var currency = "US$5,365.20".Replace("US", string.Empty);
или Alternative
Принимая B.K
предложение вы можете принять это еще один уровень больше от 3-х линий до 2 линий
var currency = 5365.20M;
var finalCurrency = currency.ToString("C", new CultureInfo("en-US")).Replace("US", string.Empty);
Почему бы просто не заменить 'US' на' String.Empty' в первую очередь, вместо того, чтобы прыгать через обручи со знаком доллара? –
Это правда. Я отредактирую ответ, чтобы показать, что альтернатива – MethodMan
@DJKRAZE, да, я могу просто заменить его. Но я использовал его в сотнях мест. Я думаю, что лучшая идея - изменить «CurrencySymbol» на приложение. начните, пока я ищу другое решение. –
Вы можете изменить символ валюты для мелкого клона, конкретной культуры в:
var d = 2353.23M;
var currencyFormat = (NumberFormatInfo)CultureInfo.GetCultureInfo("en-US").NumberFormat.Clone();
currencyFormat.CurrencySymbol = "$"; // Change to something like %^# to test it
var currency = d.ToString("C", currencyFormat);
Я никогда не видел этого раньше, вы уверены, что не добавляете 'US' в свою строку? Опубликуйте код нарушения. – mattytommo
Можете ли вы поделиться своим фрагментом кода? Похоже, что здесь работает: https://dotnetfiddle.net/RSOHZE –
Чтобы получить существующую 'CultureInfo', я думаю, вам нужно использовать' CultureInfo.GetCultureInfo («en-US») ' –