0

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

例如

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”,但它不会!

4

3 回答 3

1

不太清楚为什么 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 爵士的小提琴,它只是没有解析步骤,这对你的整体任务似乎相当重要

于 2022-01-20T07:30:43.517 回答
1

让我们看一下 的实现String.ToString()

// Returns this string.
public override string ToString()
{
    return this;
}

// Returns this string.
public string ToString(IFormatProvider? provider)
{
    return this;
}

如您所见,返回的是相同的实例。这也反映在文档中,它将显示在智能感知中(但我不确定这是否来自 resharper 插件的视觉工作室):

在此处输入图像描述

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

string sourceValue = "0,123";
var sourceInt = double.Parse(sourceValue, CultureInfo.InvariantCulture);

string target_invariant = sourceValue;
string targetValue = sourceInt.ToString(CultureInfo.CurrentUICulture);

这将使用double.ToString(...)which 实际使用文化:

public string ToString(IFormatProvider? provider)
{
    return Number.FormatDouble(m_value, null, NumberFormatInfo.GetInstance(provider));
}
于 2022-01-20T07:32:52.657 回答
0

而不是将字符串转换为另一个字符串InvariantCulture不会帮助您转换十进制值.

你需要sourceValue用德国文化解析十进制,

//You can parse as double too.
decimal result = decimal.Parse(sourceValue, CultureInfo.GetCultureInfo("de-de"));

.现在您可以使用using进行打印CultureInfo.InvariantCulture

Console.WriteLine(result.ToString(CultureInfo.InvariantCulture));

在线尝试:.Net Fiddle

于 2022-01-20T07:19:33.630 回答