我有一个用非托管C++编写的程序,我需要从系统中获取文化信息并将该信息设置为我的c ++应用程序中的当前执行线程.
谢谢.
例如,我有一个双倍
double d = 4.323d;
Run Code Online (Sandbox Code Playgroud)
我想在Silverlight 4应用程序的TextBlock中显示它,但显示应该是这样的:
4.32
我无法在绑定上更改StringFormat.
唯一的例外是,如果数字是这样的:
double d2 = 4d;
Run Code Online (Sandbox Code Playgroud)
然后它应该显示
4
不是4.00
.
最糟糕的例外是它应该考虑到当前的UI文化,这意味着如果应用程序在美国部署,它应该使用a .
作为小数分隔符,而在欧洲它应该使用a ,
(而不是在英国,但你明白了......)
我可以将defaultformat设置为#.##
IF我能够更改StringFormat,但我想通过CultureInfo来实现
我的应用程序允许用户捕获数值。在上下文中,我不知道他们是在获取货币价值还是其他一些数字金额。我需要适应不同的小数点分隔符和分组分隔符,但是我应该从 CultureInfo 中选择哪个?
有谁知道在什么情况下 NumberDecimalSeparator 和 CurrencyDecimalSeparator 可能不同?
因此,根据CultureInfo类规范,它是[Serializable].但是,当我有另一个[Serializable]类(比如ClassA)具有对CultureInfo实例的引用时,我尝试使用ClassA创建一个XmlSerializer实例时,我得到一个异常.有人知道一个工作吗?我认为,因为CultureInfo是[Serializable],下面应该可行.
非常感谢!
- 代码 -
using System;
using System.Xml.Serialization;
using System.Globalization;
namespace CultureInfoSerializationTest
{
class Program
{
static void Main(string[] args)
{
ClassA aClass = new ClassA();
aClass.UsedCulture = CultureInfo.CurrentCulture;
try
{
XmlSerializer serializer = new XmlSerializer(typeof(ClassA));
} catch (Exception e) { }
}
}
[Serializable]
public class ClassA
{
public CultureInfo UsedCulture { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
- 例外 -
System.InvalidOperationException was caught
HResult=-2146233079
Message=There was an error reflecting type 'CultureInfoSerializationTest.ClassA'.
Source=System.Xml
StackTrace:
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, …
Run Code Online (Sandbox Code Playgroud) 我知道日期/数字的文化规则对于整本书来说已经足够了,我想我有一个简单的问题.
使用InvariantCulture是否基本上意味着您明确定义将输入/显示的值(日期/数字/等)的文化?它会覆盖任何其他文化设置(例如用户代理的设置)?
如果应用程序是为一个且只有一种文化的受众构建的,那么使用InvariantCulture并定义每次输入/显示值的方式是否合理?
我有一个数据表,该数据表中的一些列具有双精度类型的值。
到目前为止一切都很好,但是当我得到该值时,0.0000005
它显示了一些 5E-9 指数值。
我需要显示相同的值而不是指数。
我像这样应用了文化信息,但它对我没有帮助:
NumberFormatInfo numberFormat = new NumberFormatInfo();
numberFormat.NumberGroupSeparator = string.Empty;
numberFormat.NumberDecimalDigits = 9;
CultureInfo info = new CultureInfo(CultureInfo.CurrentCulture.Name);
info.NumberFormat = numberFormat;
//data table having data
targetTable.Locale=info;
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
谢谢,
莫罕
我在Windows 8.1控制面板中将我的区域/位置更改为南非.当我从Visual Studio 2013启动我的应用程序并获得CultureInfo.CurrentUICulture时,它仍然显示"en-US".
public CultureInfo getCurrentCulture() {
if (CultureInfo.DefaultThreadCurrentUICulture != null) {
return CultureInfo.DefaulThreadCurrentUICulture;
} else {
return CultureInfo.CurrentUICulture;
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过CultureInfo.CurrentCulture而不是CurrentUICulture,但它们的行为方式相同.如何通过代码确定用户的真实语言环境?或者我是否通过Windows设置错误地设置了区域?
我的应用程序格式化货币字符串等,我需要确保它使用正确的货币符号.南非对我来说是一个很好的用例,因为他们仍然使用英语,但只是有不同的区域数字格式.
从控制面板,我将我的区域和语言设置设置为法语(法国)
当我将应用程序作为控制台应用程序运行时,
Thread.CurrentThread.CurrentCulture
返回法语
但是,当我将它作为Windows服务运行时,它会返回不变的文化或英语(美国)
有办法解决这个问题吗?
我想在本地文化中输出一个时间跨度,将其作为csv导入Excel中.时间跨度包含毫秒.
与英国文化,这意味着,例如00:00:01.2345678
与德国文化,这应该是00:00:01,2345678
(逗号而不是点)
但无论我为CultureInfo对象尝试哪种设置,我都无法让它工作:
TimeSpan t = new TimeSpan(12345678);
var cul = CultureInfo.GetCultureInfo("de");
// cul.DateTimeFormat.FullTimeSpanPositivePattern == "d':'h':'mm':'ss','FFFFFFF";
// (note the comma)
Console.WriteLine(String.Format(cul, "{0}", t));
// expected: "00:00:01,2345678" (with ,)
// actual: "00:00:01.2345678" (with .)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我甚至无法分辨CultureInfo类的哪些属性定义了这个.这是硬编码的吗?
我知道我可以明确地定义输出格式:`String.Format("{0:hh \:mm \:ss \,FFFFFFF}",t)
但有没有办法使用a IFormatProvider
,所以c#将使用给定的文化?
我围绕字符串转换和货币编写了一些单元测试。
给定CultureInfo方法已通过,我正在测试是否以期望的格式返回字符串。
public string GetOverspendAmount(double _amount, CultureInfo cultureInfo)
{
return amount.ToString("N", cultureInfo);
}
Run Code Online (Sandbox Code Playgroud)
我正在通过以下调用对这部分代码进行单元测试-
double amount = 1000000;
CultureInfo ci = new CultureInfo("fr-FR", false);
GetOverspendAmount(amount, ci).Should().Be("1 000 000");
Run Code Online (Sandbox Code Playgroud)
但测试失败。预期外观与实际外观相同,但将其放入ascii转换器后,将显示以下结果
Expected - 1 000 000
49 32 48 48 48 32 48 48 48
Actual - 1 000 000
049 194 160 048 048 048 194 160 048 048 048
Run Code Online (Sandbox Code Playgroud)
它们不是普通空间,但我想知道它们是什么,为什么它们不只是普通空间?
cultureinfo ×10
c# ×8
.net ×1
.net-4.5 ×1
.net-4.6 ×1
c#-4.0 ×1
c++ ×1
culture ×1
datatable ×1
datetime ×1
formatting ×1
localization ×1
silverlight ×1
timespan ×1
tostring ×1
unit-testing ×1
unmanaged ×1
windows ×1
windows-8.1 ×1
wpf ×1