提问人:CodingLearner 提问时间:1/20/2022 更新时间:1/20/2022 访问量:565
带有小数点分隔符的值如何与具有 CultureInfo.InvariantCulture 设置的 ToString 配合使用 非英语区域设置 [已关闭]
How does a values with decimal separators work with ToString with CultureInfo.InvariantCulture setting for Non english locale [closed]
问:
我有一个简单的用例,我正在使用一个将德语设置为系统区域设置的系统(区域格式为德语,当前系统区域设置为德语)。
例如
string sourceValue = "0,123";
string target_invariant = sourceValue.ToString(CultureInfo.InvariantCulture);
string targetValue = sourceValue.ToString();
Console.WriteLine(target_invariant); // shows 0,123
Console.WriteLine(targetValue); // 0,123
我本来以为将 InvariantCulture 与 ToString 一起使用会产生一种非特定文化格式,例如“0.123”,但事实并非如此!
答:
0赞
Prasad Telkikar
1/20/2022
#1
而不是将字符串转换为另一个字符串,不会帮助您将十进制值转换为 ,InvariantCulture
.
您需要解析给定的十进制与德国文化,sourceValue
//You can parse as double too.
decimal result = decimal.Parse(sourceValue, CultureInfo.GetCultureInfo("de-de"));
现在您可以使用 、 进行打印。.
CultureInfo.InvariantCulture
Console.WriteLine(result.ToString(CultureInfo.InvariantCulture));
在线试用 : .Net Fiddle
1赞
Caius Jard
1/20/2022
#2
不太确定为什么 Prasad 删除了他们的答案 - 它看起来接近于您的解决方案,只是使用了错误的文化进行解析。
无论如何,使用其区域性来解析您的数字,然后打印将数字转换为具有不同区域性的字符串的结果
var germanCulture = System.Globalization.CultureInfo.GetCultureInfo("de-de");
decimal sourceValue = decimal.Parse("0,123", germanCulture);
string target_invariant = sourceValue.ToString(System.Globalization.CultureInfo.InvariantCulture);
string targetValue = sourceValue.ToString(germanCulture);
Console.WriteLine(target_invariant);
Console.WriteLine(targetValue);
大部分代码都归功于 rufo 爵士的小提琴,它只是没有解析步骤,这似乎对你的整体任务相当重要
1赞
sommmen
1/20/2022
#3
下面我们来看看它的实现:String.ToString()
// Returns this string.
public override string ToString()
{
return this;
}
// Returns this string.
public string ToString(IFormatProvider? provider)
{
return this;
}
正如你所看到的,只返回了相同的实例。这也反映在文档中,该文档将显示在智能感知中(但我不确定这是否来自 resharper 插件的 visual studio):
您应该做的是将字符串解析为浮点数据类型,然后将其转换为适当的区域性。
string sourceValue = "0,123";
var sourceInt = double.Parse(sourceValue, CultureInfo.InvariantCulture);
string target_invariant = sourceValue;
string targetValue = sourceInt.ToString(CultureInfo.CurrentUICulture);
这将使用实际使用区域性的:double.ToString(...)
public string ToString(IFormatProvider? provider)
{
return Number.FormatDouble(m_value, null, NumberFormatInfo.GetInstance(provider));
}
评论