字符串到双转换(逗号到点的问题)

String to Double Conversion (Comma to dot issue)

努力学习基础知识 - 我正在尝试编写一个简单的货币转换器。外源提供的XML汇率用逗号作为小数点分隔符(kurs_sredni):

<pozycja>
    <nazwa_waluty>bat (Tajlandia)</nazwa_waluty>
    <przelicznik>1</przelicznik>
    <kod_waluty>THB</kod_waluty>
    <kurs_sredni>0,1099</kurs_sredni>
</pozycja>

我已经设法将数据从 XML 加载到一个漂亮的对象列表 (kursyAktualne) 中,现在我正在尝试计算。我坚持转换。

首先,我将 "kurs_sredni" 分配给一个字符串,尝试用“.”替换“,”。并将其转化为地狱:

string kursS = kursyAktualne[iNa].kurs_sredni;
kursS.Replace(",",".");
kurs = Convert.ToDouble(kursS);
MessageBox.Show(kurs.ToString());

消息框显示 1099 而不是预期的 0.1099 并且 kursS 仍然有逗号,而不是点。

尝试使用我在 Google 上搜索的一些 cultureInfo 内容,但那太随意了。我需要了解如何控制它。

这是因为 Replace 方法 returns 新字符串替换了字符。它不会修改您的原始字符串。

因此您需要重新分配它:

kursS = kursS.Replace(",",".");

只需使用 decimal.Parse 但指定 CultureInfo。没什么 "random" - 选择一个合适的 CultureInfo,然后使用它。例如:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        var french = CultureInfo.GetCultureInfo("fr-FR");
        decimal value = decimal.Parse("0,1099", french);
        Console.WriteLine(value.ToString(CultureInfo.InvariantCulture)); // 0.1099
    }
}

这只是使用法语作为 一个 使用 , 作为小数点分隔符的文化示例。使用数据来源的文化可能是有意义的。

请注意,decimal 是比 double 更好的货币值选择 - 您试图表示在 base10 中自然指定的 "artificial" 构造,而不是 "natural" 连续值,例如重量。

(我也会提防以非标准格式提供数据的数据提供者。如果他们弄错了,谁知道他们还会犯什么错误。这不像 XML 没有 明确的数字格式...)

替换returns一个字符串。所以你需要一个作业。

kursS = kursS.Replace(",", ".");

使用 CulturInfo 有 "neater" 方法可以做到这一点。在 MSDN 网站上查找。

你替换的结果没有被使用,而是不包含替换的原始值。 你应该这样做:

kursS = kursS.Replace(",", ".")

此外,如果有千位分隔符,这种方法也不是很安全。 因此,如果您不使用区域性设置,您应该这样做:

kursS = kursS.Replace(".", "").Replace(",", ".")