标签: cultureinfo

货币图书馆

我正在寻找一个.Net类/库与货币缩写词一起使用,就像TimeZoneInfo类与时区一样.

我需要使用这些首字母缩写填充下拉列表并将结果存储在数据库中.此值将用于在稍后阶段从Web检索最新的汇率.

有任何想法吗?

c# asp.net-mvc cultureinfo

6
推荐指数
1
解决办法
1182
查看次数

不区分大小写的字符串替换正确使用"ß"<=>"ss"之类的连字

我已经构建了一个小的asp.net表单,可以搜索某些内容并显示结果.我想在搜索结果中突出显示搜索字符串.例:

Query: "p"
Results: a<b>p</b>ple, banana, <b>p</b>lum
Run Code Online (Sandbox Code Playgroud)

我的代码是这样的:

public static string HighlightSubstring(string text, string substring)
{
 var index = text.IndexOf(substring, StringComparison.CurrentCultureIgnoreCase);
 if(index == -1) return HttpUtility.HtmlEncode(text);
 string p0, p1, p2;
 text.SplitAt(index, index + substring.Length, out p0, out p1, out p2);
 return HttpUtility.HtmlEncode(p0) + "<b>" + HttpUtility.HtmlEncode(p1) + "</b>" + HttpUtility.HtmlEncode(p2);
}
Run Code Online (Sandbox Code Playgroud)

我主要是工作,但尝试用例如HighlightSubstring("ß", "ss").这崩溃是因为在德国,"ß"和"ss"被认为是相同IndexOf方法,但它们有不同的长度!

现在,如果有办法找出"文本"中的匹配有多长,那就没关系了.请记住,这个长度可以!= substring.Length.

那么如何找出IndexOf在存在连字和外来语言字符时出现的匹配长度(在这种情况下是连字)?

.net culture encoding localization cultureinfo

6
推荐指数
1
解决办法
352
查看次数

处理文化支持的DateTime值的有限范围时,最佳做法是什么?

我目前正在进行项目的全球化进程(.net mvc2应用程序),全球化对我来说有点新鲜.我注意到DateTime.ToString()在为某些文化格式化时,可能会导致过去或将来的值太过ArgumentOutOfRangeException.特别是,用于"ar"和"ar-SA"(UmAlQuraCalendar)的日历具有非常有限的最小和最大支持日期.使用UmAlQuraCalendar时,1930年4月之前或2029年5月之后的任何日期都会导致此问题.这很容易观察到:

DateTime.ParseExact("1900", "yyyy", CultureInfo.InvariantCulture).ToString("G", new CultureInfo("ar"));
Run Code Online (Sandbox Code Playgroud)

请原谅我对这个问题的无知,但我想知道这里的最佳做法是什么.如果我可以在1930年之前表示日期而不必在每次打印日期时添加异常处理,我希望如此,但我也想尊重用户的文化.这是切换这些文化的日历的最佳选择吗?从一些谷歌搜索看来,可选提供的HijriCalendar与UmAlQuraCalendar非常相似,但是具有更宽松的最小和最大支持日期.这是很多人遇到的问题吗?我对这个特殊问题没有多少建议.如果没有一些建议,我会犹豫是否只是随心所欲地改变这些文化中使用的默认日历.

.net globalization datetime cultureinfo

6
推荐指数
1
解决办法
290
查看次数

MVC3正确的方式来改变每个请求的文化

我正在使用MVC3,并且有一些改变文化的逻辑,一切正常.我的问题是,似乎有一些地方应该进行这种改变,我不确定哪里是最好的地方.

一些示例显示了对每个操作的覆盖,如下所示:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    // code to change culture
}
Run Code Online (Sandbox Code Playgroud)

而我以前看到的更传统的方式是在Global.asax文件中执行,如下所示:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    // code to change culture
}
Run Code Online (Sandbox Code Playgroud)

建议的地方是什么?

cultureinfo asp.net-mvc-3

6
推荐指数
1
解决办法
4467
查看次数

对WCF服务的异步调用不会保留CurrentCulture

根据这个问题 的答案,async/await调用应该保留CurrentCulture.就我而言,当我调用自己的异步方法时,将保留CurrentCulture.但是,如果我调用某种WCF服务方法,则不会保留CurrentCulture,它会被更改为看起来像服务器默认线程文化的东西.

我已经了解了调用托管线程的内容.它发生在每个代码行都在一个托管线程上执行(ManagedThreadId保持不变).在调用我自己的异步方法后,CultureInfo保持不变.但是当我调用WCF的方法时,ManagedTrheadId保持不变,但CurrentCulture已更改.

简化的代码如下所示::

private async Task Test()
{
    // Befoe this code Thread.CurrentThread.CurrentCulture is "ru-RU", i.e. the default server's culture

    // Here we change current thread's culture to some desired culture, e.g. hu-HU
    Thread.CurrentThread.CurrentCulture = new CultureInfo("hu-HU");

    var intres = await GetIntAsync();
    // after with await Thread.CurrentThread.CurrentCulture is still "hu-HU"

    var wcfres = await wcfClient.GetResultAsync();
    // And here Thread.CurrentThread.CurrentCulture is "ru-RU", i.e. the default server's culture
}


private async Task<int> GetIntAsync()
{
    return await Task.FromResult(1);
} …
Run Code Online (Sandbox Code Playgroud)

c# wcf cultureinfo async-await asp.net-web-api

6
推荐指数
1
解决办法
1772
查看次数

将CurrentCulture设置为Task creator CurrentCulture执行任务

我有一个使用Tasks的应用程序.我们还修改了cultureInfo(我们使用EN-US语言,但保留日期/数字格式),我们使用.Net 4.0.

应用程序有很多线程和任务,我们有一个工厂来创建任务/线程.

对于该线程,我们有以下代码,以确保使用正确的CurrentCulture启动每个线程:

//This is basically only the constructor, but it describe well how we create the Thread:
public MonitoredThread(ThreadStart threadStart, string name, bool isBackground = false)
{
    m_threadStart = threadStart;
    m_name = name;
    m_isBackground = isBackground;
    Thread = new Thread(ThreadWorker)
    {
        Name = name,
        IsBackground = isBackground,
        CurrentCulture = CustomCultureInfo.CurrentCulture,
        CurrentUICulture = CustomCultureInfo.CurrentCulture
    };
}
Run Code Online (Sandbox Code Playgroud)

但是对于Tasks,我不知道如何实现这种机制:

public static Task ExecuteTask(Action action, string name)
{
    MonitoredTask task = new MonitoredTask(action, name);
    return Task.Factory.StartNew(task.TaskWorker);
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

.net c# multithreading cultureinfo task-parallel-library

6
推荐指数
1
解决办法
4882
查看次数

国家/地区名称为ISO 3166-2代码

我知道如何通过使用将ISO 3166-2代码转换为完整的英文名称,例如"US"到"United States" RegionInfo.

但是,我怎么能做相反的事情,即拿"美国"并返回"美国"?

c# globalization regioninfo cultureinfo iso-3166

6
推荐指数
1
解决办法
5145
查看次数

如何将阿拉伯语Umm Al-Qura日期字符串解析为.NET DateTime对象?

我在Umm Al-Qura日历中有以下阿拉伯语日期,我要解析为.NET DateTime对象:

الأربعاء,17ذوالحجة,1436

此日期相当于公历中的2015年9月30日.

我一直在尝试使用以下"标准"C#代码来解析这个日期,但没有成功:

var cultureInfo = new CultureInfo("ar-SA");
cultureInfo.DateTimeFormat.Calendar = new UmAlQuraCalendar(); // the default one anyway

var dateFormat = "dddd? dd MMMM? yyyy"; //note the ? instead of ,

var dateString = "??????????? 17? ?? ??????? 1436";
DateTime date;
DateTime.TryParseExact(dateString, dateFormat, cultureInfo.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces, out date);
Run Code Online (Sandbox Code Playgroud)

无论我做什么,结果TryParseExact总是如此false.如何在.NET中正确解析此字符串?

顺便说一句,如果我从一个DateTime对象开始,我可以ToString()DateTime没有问题的情况下使用's overloads 创建上面的确切日期字符串.我显然不能以相反的方式做到这一点.

.net c# datetime date cultureinfo

6
推荐指数
1
解决办法
1299
查看次数

DateTimeFormatInfo.MonthDayPattern在Windows Server 2012中已更改 - 如何将其重新设置?

在澳大利亚,一位客户已成为"1/5"5月1日的捷径.我们刚刚从Windows Server 2008迁移到Windows Server 2012.

在LinqPad中使用以下代码:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-au", false);
System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthDayPattern.Dump();
DateTime.Parse("1/5").Dump();
Run Code Online (Sandbox Code Playgroud)

在Windows Server 2008上:

dd MMMM

1/05/2016 12:00:00 AM

在Windows Server 2012 R2上:

MMMM d

5/01/2016 12:00:00 AM

问题:

  1. 为什么MonthDayPattern发生了变化?澳大利亚人总是先有一天,然后是一个月
  2. 哪里可以在Windows Server UI中设置?UI仅公开长格式和短格式,而不是月和日格式
  3. 考虑DateTime.Parse到整个系统可能发生的一切(例如,模型绑定,验证等),如何在应用程序中以最少的更改来解决问题

.net c# cultureinfo

6
推荐指数
1
解决办法
312
查看次数

如何在Web Api控制器中安全地获取本地化字符串?

我正在尝试本地化我的网络API的响应.

我在项目中创建了一个包含所有本地化字符串的资源文件(Messges.resx).并使用Accept-Language标头来识别用户的语言.

在响应中,我可以将字符串设置为:

response = Messages.KEY_GOOD_MORNING
Run Code Online (Sandbox Code Playgroud)

它将以当前线程文化的语言获取该名称的字符串.我将不得不将线程的当前文化更改为从Accept-Language标题中找到的文化.但我不想改变线程的文化,因为这也会改变数字/日期格式,这对我来说是个问题.

我看到的另一种选择是 - 使用ResourceManager并将文化传递给 -

Messages.ResourceManager.GetString("KEY_GOOD_MORNING", CultureInfo.CreateSpecificCulture(lang.value))
Run Code Online (Sandbox Code Playgroud)

这样我就不必改变线程的文化.但这种方法的问题是 - 字符串名称不再是类型安全的.传递给GetString()的字符串名称中的拼写错误可能导致返回空值.

我可以采取其他方法来避免上述问题吗?

c# localization cultureinfo

6
推荐指数
1
解决办法
1011
查看次数