将包含数值的字符串转换为具有不同区域性设置的相同字符串,同时保留原始格式

Posted

技术标签:

【中文标题】将包含数值的字符串转换为具有不同区域性设置的相同字符串,同时保留原始格式【英文标题】:Convert a string containing a numeric value to the same string with different culture settings while preserving the original format 【发布时间】:2015-08-03 19:01:25 【问题描述】:

我有一个字符串,其中包含某种文化中的数值(例如,字符串是“$ 1000.00”,文化是“en”)。我想将此字符串转换为其他文化中的字符串,同时尽可能多地保留有关原始格式的信息。 例如:

"$ 1000.00" 在“en”文化中 => "1 000,00 $" 在“ru”文化中。

我尝试了最明显的方法:

private static bool TryConvertNumberString(IFormatProvider fromFormat, IFormatProvider toFormat, string number, out string result)

    double numericResult;
    if (!double.TryParse(number, NumberStyles.Any, fromFormat, out numericResult))
    
        result = null;
        return false;
    

    result = numericResult.ToString(toFormat);
    return true;

但这并不像我想要的那样工作:double.TryParse “吃掉”有关货币符号、十进制数字等存在的所有信息。所以如果我尝试像这样使用这种方法:

string result;
TryConvertNumberString(new CultureInfo("en"), new CultureInfo("ru"), "$ 1000.00", out result);
Console.WriteLine(result);

我只会得到1000,而不是"1 000,00 $"

是否有使用 .NET 实现此行为的简单方法?

【问题讨论】:

【参考方案1】:

Double.ToString(IFormatProvider) method 使用the general ("G") format specifier 作为默认值,并且该说明符不返回当前NumberFormatInfo 对象的CurrencySymbol 属性。

您可以在 ToString 方法中使用 The "C" (or currency) format specifier 作为第一个参数,这正是您要寻找的。​​p>

result = numericResult.ToString("C", toFormat);

Here a demonstration.

顺便说一句,ru-RU 文化有 作为CurrencySymbol,如果你想要$ 作为结果,你可以Clone 这个ru-RU 文化,设置这个CurrencySymbol 属性,然后在你的toFormat 部分使用那个克隆的文化。

var clone = (CultureInfo)toFormat.Clone();
clone.NumberFormat.CurrencySymbol = "$";
result = numericResult.ToString("C", clone);

【讨论】:

以上是关于将包含数值的字符串转换为具有不同区域性设置的相同字符串,同时保留原始格式的主要内容,如果未能解决你的问题,请参考以下文章

Java 8:将具有字符串值的映射转换为包含不同类型的列表

将数字字符串转换为不同的区域格式

从字符串中获取唯一的整数值

EXCEL表中,怎样将名字相同的信息合并,将其中的数值相加?

算法: 把字字符串转化为整数;

如何将内容不同但结构相同的 JSON 字符串转换为 C# 对象?