Региональные настройки IIS6 и ASP.Net 2 — {0:c} возвращает слишком много десятичных знаков в представлении сетки

В настоящее время я перемещаю свой веб-сайт с существующего веб-сервера на новую машину.

Новая машина - это ВЫИГРЫШ Sever 2003, работающий под управлением IIS6. Сайт использует ASP.Net 2.

Я добавил следующее в раздел <system.web> моего файла machine.config, чтобы веб-сайт и любые будущие сайты использовали региональные настройки для Южной Африки вместо настроек по умолчанию для США.

<globalization culture="en-ZA" uiCulture="en-ZA"/>

Это в основном сработало - символы валюты изменились с $ на R, как и должны, но у меня есть столбец в представлении сетки (связанное поле - тип БД - деньги), который установлен следующим образом:

DataFormatString="{0:c}"

[Редактировать] - пробовал это с {0:C}, а также в соответствии с предложением Ричарда ниже: все равно не повезло

Это по-прежнему возвращает 10000.0000 вместо 10 000,00 рэндов, как это было на моем старом сервере.

Есть идеи, как это исправить?

Спасибо!

[Изменить]. Я начинаю думать, что это имеет мало общего с фактическими настройками культуры.

У меня есть другая форма, где она отлично работает:

<ItemTemplate>
    <asp:Label ID="Label2" runat="server" Text='<%# Bind("Balance", "{0:c}") %>'></asp:Label>
</ItemTemplate>

Форма, которая не работает, использует вид сетки без шаблона:

<asp:BoundField DataField="Amount" HeaderText="Amount" SortExpression="Amount" DataFormatString="{0:C}" >
    <ItemStyle CssClass="al-r" />
</asp:BoundField>

person Nils    schedule 23.02.2009    source источник


Ответы (3)


В связанном поле попробуйте установить HtmlEncode="false".

<asp:BoundField DataField="Amount" HeaderText="Amount" SortExpression="Amount" DataFormatString="{0:C}" HtmlEncode="false">
    <ItemStyle CssClass="al-r" />
</asp:BoundField>
person Phaedrus    schedule 23.02.2009

MSDN показывает заглавную букву C для валюты, а не строчную.

(Спецификаторы форматирования чувствительны к регистру.)


Обновление: теперь протестируйте вещи здесь.

Код:

class Program {
    static void Main(string[] args) {
        decimal val = 1234567.89M;

        using (var file = new FileStream(args[0], FileMode.Create, FileAccess.Write))
        using (var output = new StreamWriter(file, Encoding.UTF8)) {
            output.WriteLine("Thread culture: " + Thread.CurrentThread.CurrentCulture.Name);
            output.WriteLine("Thread UI culture: " + Thread.CurrentThread.CurrentUICulture.Name);

            var cultures = new[] { "en-US", "en-GB", "af-ZA", "fr-FR", "fr-CA" };
            foreach (var culture in cultures) {
                var ci = new CultureInfo(culture);
                output.WriteLine(String.Format(ci, "{0,-10}: {1:C}", ci.Name, val));
            }
        }
    }
}

Дает вывод:

Thread culture: en-GB
Thread UI culture: en-US
en-US     : $1,234,567.89
en-GB     : £1,234,567.89
af-ZA     : R 1,234,567.89
fr-FR     : 1 234 567,89 €
fr-CA     : 1 234 567,89 $

Что выглядит нормально для меня.

Как вы устанавливаете культуру?

person Richard    schedule 23.02.2009
comment
Спасибо, Ричард, но это не то. а) тот же код с маленькой буквой c отлично работает на старом сервере б) я изменил его на заглавную букву C на новом сервере, и он по-прежнему показывает 10000.0000 вместо 10 000,00 рэндов - person Nils; 23.02.2009

спасибо за вашу помощь с этим.

Я решил эту проблему, установив Service Pack 2 для ASP.Net 2.0 - после перезагрузки сетка работала нормально с {0:C}.

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

Усвоенный урок: всегда следите за тем, чтобы все программное обеспечение вашего сервера было обновлено!

person Nils    schedule 23.02.2009
comment
Я не хотел бы вкладывать деньги в решение ваших проблем. Смотрите ответ Федра. У меня была аналогичная проблема, когда моя кодировка работала на машине разработчика, но не на сервере развертывания. - person Hooloovoo; 24.08.2009