带有小数点分隔符的值如何与具有 CultureInfo.InvariantCulture 设置的 ToString 配合使用 非英语区域设置 [已关闭]

How does a values with decimal separators work with ToString with CultureInfo.InvariantCulture setting for Non english locale [closed]

提问人:CodingLearner 提问时间:1/20/2022 更新时间:1/20/2022 访问量:565

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

去年关闭。

我有一个简单的用例,我正在使用一个将德语设置为系统区域设置的系统(区域格式为德语,当前系统区域设置为德语)。

例如

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”,但事实并非如此!

C# 字符串 区域性 InvariantCulture

评论

1赞 Sir Rufo 1/20/2022
好吧,你把一个字符串转换成一个字符串 - 文化没有什么特别的 - 它会是一样的
0赞 Sir Rufo 1/20/2022
我猜您正在寻找双精度十进制转换为字符串,因为文化很重要;
0赞 Sir Rufo 1/20/2022
这是你的小提琴 dotnetfiddle.net/D6l4Lr
4赞 Caius Jard 1/20/2022
所以你去了字符串的文档。ToString(IFormatProvider) 并在主描述的第一行看到“返回字符串;不执行转换”

答:

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):

enter image description here

您应该做的是将字符串解析为浮点数据类型,然后将其转换为适当的区域性。

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));
}