标签: cultureinfo

如何在C#中获取当前的区域设置?

通常你可以写一些像这样的东西

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

但是这样您只能获得在启动应用程序时配置的CultureInfo,如果之后设置已更改,则不会更新.

那么,如何在控制面板 - >区域和语言设置中获取当前配置的CultureInfo?

c# cultureinfo

24
推荐指数
2
解决办法
5万
查看次数

是否可以为.NET应用程序或仅为线程设置CultureInfo?

我有一个用C#编写的应用程序,它没有GUI或UI,而是编写由另一个应用程序解析的文件(在XML和其他应用程序中).

我有一个客户,其CultureInfo将NumberDecimalSeparator设置为逗号,导致浮点数解析错误(PI最终为3,1415).

我想要一种在应用程序中为所有线程全局设置CultureInfo的方法.我试过了:

  1. (显然)习惯性的方法是将CurrentThread.CurrentCulture设置为Main()中的第一行,但它似乎被重置.
  2. http://www.codeproject.com/KB/cs/Change_App_Culture.aspx上的变体/扩展
  3. 对应用程序中显式创建的线程执行相同的操作(#1).

更改为使用显式格式不是一种选择(150K +行,大多数由前雇员编写).

[编辑] 应用程序绑定到套接字并处理来自专用客户端的请求.根据请求类型,它会生成不同的处理程序类.

对不起,当我第一次发布时,我应该在#1中澄清(我虽然)我已经在所有明确生成的处理程序中完成了这一点.

事实证明我错过了导致问题的线程/处理程序. 所以应用程序现在正常工作,但问题仍然是关于是否可以在所有线程上设置文化.

如果它可以迭代所有线程,它也会解决问题.所以:

如何在当前进程中获取所有Thread对象(而不是ProcessThread)?

c# culture cultureinfo number-formatting

24
推荐指数
3
解决办法
2万
查看次数

如何使用CultureInfo生成本地化的日期字符串

我有以下代码以en-us格式生成日期字符串.我想传入LCID(或本地化语言的等效值)来生成日期字符串的本地化版本.我怎么做到这一点?

public static string ConvertDateTimeToDate(string dateTimeString) {

    CultureInfo culture = CultureInfo.InvariantCulture;
    DateTime dt = DateTime.MinValue;

    if (DateTime.TryParse(dateTimeString, out dt))
    {
        return dt.ToShortDateString();
    }
    return dateTimeString;
  }
Run Code Online (Sandbox Code Playgroud)

.net c# datetime cultureinfo

24
推荐指数
2
解决办法
4万
查看次数

DateTime.ParseExact()没有查看24小时时间值?

这行代码:

DateTime dt = DateTime.ParseExact(time, "hh:mm", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

解析"时间"值"12:45"就好了,但抛出了"13:00"的异常

我应该使用其他一些CultureInfo值,还是我需要将"pm"附加到12以上的小时值,或者......?

错误消息是:System.FormatException未处理Message = String未被识别为有效的DateTime.

c# datetime cultureinfo

24
推荐指数
1
解决办法
2万
查看次数

如何翻译CultureInfo语言名称

我知道有三种方法可以获得CultureInfo对象的完整语言名称.

CultureInfo.DisplayName   
CultureInfo.NativeName  
CultureInfo.EnglishName
Run Code Online (Sandbox Code Playgroud)

DisplayName以已安装的.net语言提供名称.
NativeName以"CultureInfos"语言提供名称.
EnglishName用英文命名(令人惊讶......)

因此,对于CultureInfo de-DE,这(在英语.net上安装)
德语
德语
德语

现在我的问题是:有没有办法用另一种语言来询问de-DE的语言名称?例如,我想要荷兰语的de-DE语言名称(这将是'Duits').

c# cultureinfo

21
推荐指数
2
解决办法
1万
查看次数

这是暂时改变当前线程文化的好方法吗?

我在一个相当大的ASP .NET Web Forms应用程序上工作,该应用程序目前主要在美国使用.我们正在将其推广到世界其他地区,这当然意味着我们正在努力本地化应用程序的所有领域.一般来说,我们的方法是在每个请求开始时设置当前线程的CurrentCulture和CurrentUICulture属性,以支持基于当前用户的语言环境进行正确的格式化和资源提取.

但是,在某些情况下,我们需要使用除当前用户文化之外的文化来运行某些代码.例如,"用户A"居住在德国,但适用于与法国其他公司有业务往来的公司.当"用户A"想要为其中一家法国公司创建发票(PDF)时,我们希望发票生成代码以"fr-FR"文化而非"de-DE"文化运行.

我已经考虑过几种方法可以很容易地做到这一点,我想知道我是否正确地做到了这一点.我主要关心的是性能和线程安全性.

一种方法涉及一种静态方法,旨在使用提供的文化来运行给定任务.像这样的东西:

 public static void RunWithCulture(CultureInfo culture, Action task)
    {
        if (culture == null)
            throw new ArgumentNullException("culture");

        var originalCulture = new
                                  {
                                      Culture = Thread.CurrentThread.CurrentCulture,
                                      UICulture = Thread.CurrentThread.CurrentUICulture
                                  };

        try
        {
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
            task();
        }
        finally
        {
            Thread.CurrentThread.CurrentCulture = originalCulture.Culture;
            Thread.CurrentThread.CurrentUICulture = originalCulture.UICulture;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后可以像这样调用此方法:

var customerCulture = new CultureInfo(currentCustomer.Locale);
CultureRunner.RunWithCulture(customerCulture, () => invoiceService.CreateInvoice(currentCustomer.CustomerId));
Run Code Online (Sandbox Code Playgroud)

我还考虑创建一个实现IDisposable的类,它负责在它的ctor中设置线程文化,然后在Dispose方法中返回原始文化,所以你可以像这样调用它:

var customerCulture = new CultureInfo(currentCustomer.Locale);
using(new CultureRunner(currentCustomer.Locale))
{
  invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
Run Code Online (Sandbox Code Playgroud)

我错了吗?哪个,如果这些方法中的任何一个更可取?

.net c# localization cultureinfo

21
推荐指数
1
解决办法
4239
查看次数

如何显示特定于文化的原生数字而不是阿拉伯数字?

我想将数值转换为字符串,显示特定于文化的数字.例如,阿富汗使用的Dari语言(文化名称"prs-AF")使用东方阿拉伯数字而不是大多数西方文化中使用的阿拉伯数字(0,1,2,3,4,5,6,7,8,9).

在检查Framework内置的CultureInfo类时,它会列出正确的本机数字(从LinqPad的输出中截取):

linqpad输出

CultureInfo.CreateSpecificCulture("prs-AF").NumberFormat.NativeDigits
Run Code Online (Sandbox Code Playgroud)

但是,当尝试将数字转换为字符串以在该文化中显示时,我没有获得原始数字:

linqpad输出

var number = 123.5;
var culture = CultureInfo.CreateSpecificCulture("prs-AF");
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
var text = number.ToString(culture);
Console.WriteLine(text);
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何显示原生数字?

c# formatting localization cultureinfo

20
推荐指数
1
解决办法
4225
查看次数

我应该何时指定CurrentCulture或InvariantCulture以及何时应该将其指定为未指定?

指定CurrentCulture或InvariantCulture而不指定文化的最佳做法是什么?

例如,根据我的阅读,如果您正在进行序列化,则需要使用InvariantCulture作为指定数据值的规范表示的方法.这是基于文化的字符串操作的相对较小的百分比.

我发现它很长,很冗长,而且大部分时间都是丑陋的,每次我都说出来,比如说:

var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName); 
Run Code Online (Sandbox Code Playgroud)

然而,我的团队最近开启了FxCop,现在总是在每个地方都使用CultureInfo.结合简洁性,可读性和功能性的最佳技术是什么?

一些好的阅读材料:

c# globalization culture cultureinfo currentculture

19
推荐指数
2
解决办法
7897
查看次数

通过URL将DateTime传递给控制器​​导致ASP .NET MVC 3(文化)中的错误

我的应用程序在web.config中设置了pt-BR文化(日期是dd-mm-yyyy):

<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" />
Run Code Online (Sandbox Code Playgroud)

在我的系统上创建的所有DateTime都是正确的格式,但我创建了一个控制器方法:

public ActionResult Test(DateTime date)
{
}
Run Code Online (Sandbox Code Playgroud)

当日期采用portuguese-br格式时,直接在浏览器中调用该方法传递null,如下所示:

mysite/Test/?date=19/01/2012   => date = null in my controller

mysite/Test/?date=01/01/2012   => date is fine, but in US format (mm-dd-yyyy)
Run Code Online (Sandbox Code Playgroud)

我如何解决这个问题,接受我的日期格式?

cultureinfo asp.net-mvc-3

19
推荐指数
2
解决办法
2万
查看次数

Double.Parse - 国际化问题

这真让我抓狂.我在ASP.NET 2.0 WebForm页面中有以下字符串

string s = "0.009";
Run Code Online (Sandbox Code Playgroud)

很简单.现在,如果我的文化是西班牙语 - 这是"es-ES" - 我尝试将字符串转换为Double,我会执行以下操作:

double d = Double.Parse(s, new CultureInfo("es-ES"));
Run Code Online (Sandbox Code Playgroud)

我期待的是0,009.相反,我得到9.我明白.NET认为它是千分隔符,在en-US中是一个逗号,但不应该把我传递给parse方法的文化信息并应用正确的格式转换?

如果我做

double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));
Run Code Online (Sandbox Code Playgroud)

格式化现在是0,009.任何人?

c# string double culture cultureinfo

18
推荐指数
2
解决办法
2万
查看次数