2014-11-12 3 views
3

Я использую метод .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».

+9

Я никогда не видел этого раньше, вы уверены, что не добавляете 'US' в свою строку? Опубликуйте код нарушения. – mattytommo

+3

Можете ли вы поделиться своим фрагментом кода? Похоже, что здесь работает: https://dotnetfiddle.net/RSOHZE –

+0

Чтобы получить существующую 'CultureInfo', я думаю, вам нужно использовать' CultureInfo.GetCultureInfo («en-US») ' –

ответ

6

появляется «США» перед «$», потому что кто-то настроило символ валюты с помощью 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 $», как символ валюты.

+0

Дело в том, что 'new CultureInfo (« en-US »)' работает для меня, как я вижу, проверьте мой UPD. Тогда странно, по вашему мнению, это не должно работать. Но я думаю, что переопределение может быть причиной, во всяком случае. –

+0

Вы уверены, что на другой метке в вашем UPD используется '.ToString (« C », новая CultureInfo (« en-US »))?? Также обратите внимание, что этот код будет применять пользовательские переопределения только в том случае, если регион Windows на самом деле «английский (США)». –

+0

Да, я уверен. О настройках Windows. В любом случае я использовал дату, валюту и другие настройки для своего локального региона (я уже проверял его с настройками в США, то же самое). Настройки культуры, установленные DotNetNuke CMS, которые являются основой для этого веб-приложения. Так что теперь я думаю, что проблема есть. –

2

Тестирование, которое предоставил 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); 
+0

Почему бы просто не заменить 'US' на' String.Empty' в первую очередь, вместо того, чтобы прыгать через обручи со знаком доллара? –

+0

Это правда. Я отредактирую ответ, чтобы показать, что альтернатива – MethodMan

+0

@DJKRAZE, да, я могу просто заменить его. Но я использовал его в сотнях мест. Я думаю, что лучшая идея - изменить «CurrencySymbol» на приложение. начните, пока я ищу другое решение. –

1

Вы можете изменить символ валюты для мелкого клона, конкретной культуры в:

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); 

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

  • Нет связанных вопросов^_^