在Ubuntu上部署的.NET Core应用程序的区域设置问题

时间:2018-10-10 20:46:04

标签: asp.net localization ubuntu-18.04

我已经将.NET Core(v2.1)应用程序部署到了我的Ubuntu服务器(Ubuntu 18.04 LTS)上。应用程序的目标受众是英国人。

在C#中,我正在做

@invoice.Amount.ToString("C")

根据系统文化将值格式设置为一种货币,并且应该显示类似£107.50之类的内容,而不是$107.50

我检查了语言环境,并且拥有en_US,所以我运行了update-locale LANG=en_GB.utf8,然后重新启动了所有内容(红est,nginx和会话)。现在,当我运行locale命令时,我得到:

LANG=en_GB.utf8
LANGUAGE=
LC_CTYPE="en_GB.utf8"
LC_NUMERIC="en_GB.utf8"
LC_TIME="en_GB.utf8"
LC_COLLATE="en_GB.utf8"
LC_MONETARY="en_GB.utf8"
LC_MESSAGES="en_GB.utf8"
LC_PAPER="en_GB.utf8"
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT="en_GB.utf8"
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=

但是,我得到的是$107.50而不是£107.50。我想念什么?

1 个答案:

答案 0 :(得分:1)

阅读Standard Numeric Format Strings(在C#中有示例):

  

某些数字的重载支持标准数字格式的字符串   所有数字类型的ToString方法。例如,您可以提供   Int32.ToString(FormatSpecifier)的数字格式字符串,并且   Int32.ToString(FormatSpecifier, IFormatProvider)种方法……

因此,.ToString()方法除了IFormatProvider之外,还应接受第二个参数Currency ("C") Format Specifier(即提供特定于区域性格式信息的对象),请尝试

  • @invoice.Amount.ToString("C",CultureInfo.CurrentCulture)
  • @invoice.Amount.ToString("C",CultureInfo.CurrentUICulture)
  • @invoice.Amount.ToString("C",CultureInfo.GetCultureInfo('en-GB'))
  • @invoice.Amount.ToString("C",CultureInfo.CreateSpecificCulture('en-GB'))

(可能需要using System.Globalization)。

我目前无法提供正在运行的C#示例。但是,我可以举例说明在PowerShell中System.Globalization.CultureInfo class的(某些) static 属性和方法的使用:

PS D:\PShell> 1234.578.ToString('C',[cultureinfo]::CurrentCulture)
1 234,58 Kč

PS D:\PShell> 1234.578.ToString('C',[cultureinfo]::CurrentUICulture)
£1,234.58

PS D:\PShell> 1234.578.ToString('C',[cultureinfo]::GetCultureInfo('en-US'))
$1,234.58

PS D:\PShell> 1234.578.ToString('C',[cultureinfo]::CreateSpecificCulture('de-DE'))
1.234,58 €