Региональные настройки IIS6 и ASP.Net 2 - {0:c} возвращают слишком много десятичных знаков в виде сетки
В настоящее время я перемещаю свой веб-сайт с существующего веб-сервера на новый компьютер.
Новая машина - WIN 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 R, как это было на моем старом сервере.
Есть идеи, как это исправить?
Спасибо!
[Изменить] - Я начинаю думать, что это имеет мало общего с фактическими настройками культуры.
У меня есть другая форма, где она работает нормально:
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Balance", "{0:c}") %>'></asp:Label>
</ItemTemplate>
Форма, которая не работает, использует gridview без шаблона:
<asp:BoundField DataField="Amount" HeaderText="Amount" SortExpression="Amount" DataFormatString="{0:C}" >
<ItemStyle CssClass="al-r" />
</asp:BoundField>
3 ответа
Спасибо за вашу помощь с этим.
Я решил эту проблему, установив пакет обновления 2 для ASP.Net 2.0 - после перезагрузки сетка работала нормально с {0:C}.
Эта проблема исправилась бы в производственной среде, так как она будет настроена на автоматическое обновление. В настоящее время у нас есть новый сервер в локальной офисной сети, и наш брандмауэр, кажется, ограничивает обновления.
Извлеченный урок: всегда следите за тем, чтобы все программное обеспечение вашего сервера обновлялось!
В вашем ограниченном поле попробуйте установить HtmlEncode="false".
<asp:BoundField DataField="Amount" HeaderText="Amount" SortExpression="Amount" DataFormatString="{0:C}" HtmlEncode="false">
<ItemStyle CssClass="al-r" />
</asp:BoundField>
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));
}
}
}
}
Дает вывод:
Культура потоков: en-GB Культура пользовательского интерфейса потоков: en-US en-US: 1 234 567,89 долларов США: 1 234 567,89 фунтов стерлингов af-ZA: 1 234 567,89 франков FR-FR: 1 234 567,89 € франков: 1 234 567,89 $
Что выглядит нормально для меня.
Как вы настраиваете культуру?